Запрос на проверку всех элементов массива
У меня есть alley с такими данными (this is a alley)
{
"_id": {"$oid": "62572d82cc40164fef7f1a56"},
"name": "Аллея с 2-мя липами",
"tree": [
{"$oid": "626976eb4b93122bc617d701"},
{"$oid": "626976eb4b93122bc617d702"}
]
}
И есть tree(this is a tree)
{
"_id": {"$oid": "626976eb4b93122bc617d701"},
"dateInstall": {"$date": "2021-02-27T00:00:00.000Z"},
"species": [
{"$oid": "62585a63edfc726a4ff24fb8"}
]
},
Мне необходимо написать запрос "аллея, деревья на которой не высаживались в прошлом году"(I need to write a query "an alley where trees were not planted last year")
Написал такое(My Code)
db.alley.aggregate([
{
$lookup: {
from: "tree",
localField: "tree",
foreignField: "_id",
as: "tree"
}
},
{
$match: {{$not:{$and:[
{"tree.dateInstall": {$gt: new ISODate("2020-12-31")}},
{"tree.dateInstall": {$lt: new ISODate("2022-01-01")}}
]
}}}
}
]);
Ответы (1 шт):
Сначала вы должны раскрутить деревья в аллеях ($unwind: "$tree"), чтобы вы могли правильно $lookup-ить деревья в коллекции деревьев. Используйте pipeline внутри $lookup для запроса только деревьев, посаженных в прошлом году. Наконец, снова сгруппируйте($group) деревья в аллеи и используйте $match, чтобы отфильтровать эти аллеи без деревьев.
Это перевод ответа на en.stackoverflow: https://stackoverflow.com/questions/72096540/request-to-check-all-array-elements
db.getCollection("alley").aggregate([
{
$unwind: "$tree",
},
{
$lookup: {
from: "tree",
let: { tree: "$tree" },
pipeline: [
{
$match: {
$expr: {
$and: [
{ $eq: [ "$$tree", "$_id" ] },
{ $gt: [ "$dateInstall", new ISODate("2020-12-31") ] },
{ $lt: [ "$dateInstall", new ISODate("2022-01-01") ] },
]
}
}
}
],
localField: "tree",
foreignField: "_id",
as: "tree"
}
},
{
$group: {
_id: { id: "$_id", name: "$name" },
trees: { $addToSet: { $first: "$tree" } }
}
},
{
$match: {
trees: { $size: 0 }
}
}
])