繁体   English   中英

MongoDB 聚合对嵌套数组使用 $elemMatch

[英]MongoDB aggregation use $elemMatch for nested array

我尝试在 MongoDB 中学习聚合概念。 我创建了一个像这样的 object 用于训练。

"_id": "601c4bb56e018211b02abbf8",   
"isDeleted": false,
"name": "TeacherName1",
"class": "7",
"students": [
     { "_id": "601c4bb56e018211b02abbf9", isDeleted:true,  "name": "student-1", "studentGroup": "A",   "avgResult": 36},
     { "_id": "601c4bb56e018211b02abbfa", isDeleted:false, "name": "student-2", "studentGroup": "A",   "avgResult": 55},
     { "_id": "601c4bb56e018211b02abbfb", isDeleted:false, "name": "student-3", "studentGroup": "B",   "avgResult": 44.66},
     { "_id": "601c4bb56e018211b02abbfc", isDeleted:false, "name": "student-4", "studentGroup": "C",   "avgResult": 83.66},
     { "_id": "601c4bb56e018211b02abbfd", isDeleted:true,  "name": "student-5", "studentGroup": "B",   "avgResult": 37},
     { "_id": "601c4bb56e018211b02abbfe", isDeleted:true,  "name": "student-6", "studentGroup": "C",   "avgResult": 39.66},
]

我想获取教师信息并删除学生(isDeleted=true)。 所以我试图得到这个结果。

    "_id": "601c4bb56e018211b02abbf8",   
    "isDeleted": false,
    "name": "TeacherName1",
    "class": "7",
    "students": [
         { "_id": "601c4bb56e018211b02abbf9", isDeleted:true,  ...},
         { "_id": "601c4bb56e018211b02abbfd", isDeleted:true, ...},
         { "_id": "601c4bb56e018211b02abbfe", isDeleted:true,  ...},
    ]

我使用$unwind$filter得到结果。 但是我可以只用 $elemMatch得到这个结果吗?

如果我使用这个查询

 this.aggregate([
    {
      $match: {
        _id: mongoose.Types.ObjectId("601c4bb56e018211b02abbf8"),
        isDeleted: false,
        "students.isDeleted":true
      },
    },
  ]);

它返回所有 object。

如果我试试这个

this.aggregate([
    {
      $match: {
        _id: mongoose.Types.ObjectId("601c4bb56e018211b02abbf8"),
        isDeleted: false,
        students:{
            $elemMatch:{
                isDeleted:true
            }
        }
      },
    },
  ]);

它返回所有 object。

如果您匹配,$match 只会为您提供整个文档,但是您可以使用$project$filter使用另一个阶段

给定

db.dummy.insert({studs:[{isDeleted:true, name:'a'},{isDeleted: true, name:'b'},{name:'c'}]})
db.dummy.insert({studs:[{name:'c'}]})
> match = {$match:{studs:{$elemMatch: {isDeleted:true}}}}
> project = {$project: { deletedStuds: {$filter:{input: '$studs', as:'stud', cond:{ $eq: ['$$stud.isDeleted', true]} } } }}
{
  "$project" : {
    "deletedStuds" : {
      "$filter" : {
        "input" : "$studs",
        "as" : "stud",
        "cond" : {
          "$eq" : [
            "$$stud.isDeleted",
            true
          ]
        }
      }
    }
  }
}

> db.dummy.aggregate(match, project)
{ "_id" : ObjectId("6020351eb965951ac8a1eb62"), "deletedStuds" : [ { "isDeleted" : true, "name" : "a" }, { "isDeleted" : true, "name" : "b" } ] }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM