#mongodb #aggregation-framework
Вопрос:
У меня есть коллекция fridges
, и я хотел бы, чтобы некоторые поля из каждого холодильника соответствовали условию плюс «условный размер» предметов в этом холодильнике.
Это пример моей базы данных :
db={
"fridges": [
{
_id: 1,
items: [
{
itemId: 1,
name:"beer"
},
{
itemId: 2,
name: "chicken"
}
],
brand:"Bosch",
size:195,
cooler:true,
color:"grey"
},
{
_id: 2,
items: [
{
itemId: 1,
name:"beer"
},
{
itemId: 2,
name: "chicken"
},
{
itemId: 3,
name: "lettuce"
}
],
brand:"Electrolux",
size:200,
cooler:true,
color:"white"
},
]
}
Я хочу разобраться fridges
с этими взаимными условиями (условие «и»).:
brand
является$in ["Bosch","Samsung"]
color
является$in ["grey","white"]
Кроме того : Количество предметов с именем $in ["beer","lettuce"]
И, наконец,: удаление некоторых полей, таких как size
и items
результата.
В нашем примере исключенный вывод будет :
{
_id:1
itemsNumber:1,
brand:"Bosch",
cooler:true,
color:"grey"
}
Объяснения :
Мы удалили поле items
и size
itemsNumber
подсчитали количество пива и салата из items
массива. И мы держим только первый холодильник, его марка Bosch, и он серый.
Это то, что у меня есть до сих пор :
db.fridges.aggregate([
{
"$match": {
$and: [
{
"brand": {
$in: [
"Bosch",
"Samsung"
]
}
},
{
"color": {
$in: [
"grey",
"white"
]
}
}
]
}
},
{
"$project": {
"itemsNumber": {
$size: "$items" // This is not good
},
brand: 1,
cooler: 1,
color: 1
}
}
])
Что возвращает меня :
[
{
"_id": 1,
"brand": "Bosch",
"color": "grey",
"cooler": true,
"itemsNumber": 2
}
]
Подсчет предметов, соответствующих одному beer
или lettuce
другому, — моя главная проблема.
Это исполняемый пример.
Заранее спасибо!
Комментарии:
1. Вы пробовали использовать
$filter
?2. В настоящее время я пытаюсь его использовать, но пока он не работает.
Ответ №1:
Я узнал, как заставить его работать. Спасибо @joe за то, что предложил использовать фильтр, это действительно было решением.
Вот полный запрос :
db.fridges.aggregate([
{
$match: {
$and: [
{
"brand": {
$in: [
"Bosch",
"Samsung"
]
}
},
{
"color": {
$in: [
"grey",
"white"
]
}
}
]
}
},
{
$project: {
"itemsNumber": {
"$filter": {
"input": "$items",
"as": "item",
"cond": {
$in: [
"$item.name",
[
"beer",
"lettuce"
]
]
}
}
},
brand: 1,
cooler: 1,
color: 1
}
}
])