我有一个学生系列,想要有 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]}
我尝试了投影查询,但无法获得该结果?
答案 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并返回更改后的文档。