Mongodb按数组字段查询并在结果中显示查询的项目

时间:2014-03-16 00:55:29

标签: mongodb mongodb-query aggregation-framework

我有一个学生系列,想要有 lessonA lessonB 的学生。
例如学生集合,(课程数组字段未嵌入,其相关,我有课程收集)

{ name : 'studentX', lessons : [lessonA, lessonB, lessonF]}
{ name : 'studentY', lessons : [lessonC, lessonD, lessonE]}
{ name : 'studentZ', lessons : [lessonE, lessonF]}
{ name : 'studentT', lessons : [lessonA, lessonG, lessonH]}

当我尝试查询db.students.find(lessons: { $in : [lessonA, lessonB] })时,它会返回

 { name : 'studentX', lessons : [lessonA, lessonB, lessonF]}
 { name : 'studentT', lessons : [lessonA, lessonG, lessonH]}

但是,不想在课程数组字段中获得其他课程,事实上我想要的只是;

 { name : 'studentX', lessons : [lessonA, lessonB]}
 { name : 'studentT', lessons : [lessonA]}

我尝试了投影查询,但无法获得该结果?

1 个答案:

答案 0 :(得分:0)

您在投影中使用positional $运算符,并在查找中“匹配”您想要的元素:

db.collection.find({ "lessons": "lessonA" }, { "lessons.$" })

或者如果你想以另一种方式做到这一点:

db.collection.find({ }, { "lessons": { "$elemMatch": "lessonA" }})

为了不重新限制返回的文档,但在投影中限制数组的内容。另请参阅$elemMatch

不能做的是多个元素。不管怎么说都不使用匹配的位置类型。使用aggregate

db.collection.aggregate([
    // Filter first to reduce the matching documents
    { "$match": { "lessons": { "$in": [ "lessonA", "lessonB" ] },

    // Unwind the array
    { "$unwind": "$lessons" },

    // Actually filter the array elements
    { "$match": { "lessons": { "$in": [ "lessonA", "lessonB" ] },

    // Group back to array form
    { "$group": { 
        "_id": "$_id",
        "name": { "$first": "$name" },
        "lessons": { "$push": "$lessons" }
    }}
])

并且aggregate可以将数组$unwind作为单独的文档,然后使用$match“过滤”,最后$group并返回更改后的文档。