我有以下模型:
{
"_id" : ObjectId("...some id"),
"lessons" : [
{
"date" : ISODate("2019-09-23T16:00:00.000+02:00"),
"subject" : [
"Javascript",
"Order"
],
"price" : 60
},
{
"date" : ISODate("2019-09-24T16:00:00.000+02:00"),
"subject" : [
"Javascript"
],
"price" : 120
}
]
}
我想根据嵌套的“主题”数组中的值过滤“课程”数组。 过滤器是指从数组“课程”中删除整个对象,例如,如果嵌套数组“主题”中的值不等于值“订单”。
预期的输出(删除对象,因为嵌套数组包含“ Order”值):
{
"_id" : ObjectId("...some id"),
"lessons" : [
{
"date" : ISODate("2019-09-24T16:00:00.000+02:00"),
"subject" : [
"Javascript"
],
"price" : 120
}
]
}
我尝试使用$ filter管道,但是它会覆盖整个数组的“课程”。
db.students.aggregate([
{
$project: {
"lessons": {
$filter: {
input: "$lessons.subject",
as: "subject",
cond: {
$ne: [
"$$subject",
"Order"
]
}
}
}
}
},
]);
答案 0 :(得分:1)
我们在这里可以做的是:
$unwind
lessons
字段上将其视为单个文档。$match
字段(数组)上具有条件的 subjects
。$group
通过_id
并将lessons
推回
$push
查询:
db.collection.aggregate([
{ $unwind: "$lessons" },
{ $match: { "lessons.subject": { $ne: "Order" } } },
{
$group: {
_id: "$_id",
lessons: { $push: "$lessons" }
}
}
]).pretty();
输出:
{
"_id" : ObjectId("5d6d0d401ce4f18674c11053"),
"lessons" : [
{
"date" : ISODate("2019-09-24T14:00:00Z"),
"subject" : [
"Javascript"
],
"price" : 120
}
]
}