使用elematch的MongoDB查询从对象内部匹配嵌套数组数据



MongoDB查询,使用elematch从对象内部匹配嵌套数组数据。这里我们有三个项目对象,每个对象都包含一个带有多个对象的检查数组。这里当"project_id" : ObjectId("5b6959e3dc68d21c6613c82d")"exams"数组包含两倍的"writer.user_id":ObjectId("5b6959e3dc68d21c6613c77d")如何从第一个项目对象中筛选出这两个数据?

db.exams.insert([{
"project_id" : ObjectId("5b6959e3dc68d21c6613c82d"),
"exams" : [ 
{
"allotment_type" : "manual",
"exam_id" : 1,
"topic" : "something",
"word_count" : 5,
"key_word_density" : 2,
"writer" : {
"user_id" : ObjectId("5b6959e3dc68d21c6613c77d"),
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
},
"editor" : {
"user_id" : 1,
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
},
"manager" : {
"user_id" : 1,
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
}
}, 
{
"allotment_type" : "manual",
"exam_id" : 2,
"topic" : "something",
"word_count" : 5,
"key_word_density" : 2,
"writer" : {
"user_id" : ObjectId("5b6959e3dc68d21c6613c77e"),
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
},
"editor" : {
"user_id" : 2,
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
},
"manager" : {
"user_id" : 2,
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
}
}, 
{
"allotment_type" : "manual",
"exam_id" : 3,
"topic" : "something",
"word_count" : 5,
"key_word_density" : 2,
"writer" : {
"user_id" : ObjectId("5b6959e3dc68d21c6613c77d"),
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
},
"editor" : {
"user_id" : 3,
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
},
"manager" : {
"user_id" : 3,
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
}
}]
},
{
"project_id" : ObjectId("5b6959e3dc68d21c6613c82e"),
"exams" : [ 
{
"allotment_type" : "manual",
"exam_id" : 1,
"topic" : "something",
"word_count" : 5,
"key_word_density" : 2,
"writer" : {
"user_id" : ObjectId("5b6959e3dc68d21c6613c77d"),
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
},
"editor" : {
"user_id" : 1,
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
},
"manager" : {
"user_id" : 1,
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
}
}, 
{
"allotment_type" : "manual",
"exam_id" : 2,
"topic" : "something",
"word_count" : 5,
"key_word_density" : 2,
"writer" : {
"user_id" : ObjectId("5b6959e3dc68d21c6613c77e"),
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
},
"editor" : {
"user_id" : 2,
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
},
"manager" : {
"user_id" : 2,
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
}
}, 
{
"allotment_type" : "manual",
"exam_id" : 3,
"topic" : "something",
"word_count" : 5,
"key_word_density" : 2,
"writer" : {
"user_id" : ObjectId("5b6959e3dc68d21c6613c77c"),
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
},
"editor" : {
"user_id" : 3,
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
},
"manager" : {
"user_id" : 3,
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
}
}]
},
{
"project_id" : ObjectId("5b6959e3dc68d21c6613c82f"),
"exams" : [ 
{
"allotment_type" : "manual",
"exam_id" : 1,
"topic" : "something",
"word_count" : 5,
"key_word_density" : 2,
"writer" : {
"user_id" : ObjectId("5b6959e3dc68d21c6613c77d"),
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
},
"editor" : {
"user_id" : 1,
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
},
"manager" : {
"user_id" : 1,
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
}
}, 
{
"allotment_type" : "manual",
"exam_id" : 2,
"topic" : "something",
"word_count" : 5,
"key_word_density" : 2,
"writer" : {
"user_id" : ObjectId("5b6959e3dc68d21c6613c77e"),
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
},
"editor" : {
"user_id" : 2,
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
},
"manager" : {
"user_id" : 2,
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
}
}, 
{
"allotment_type" : "manual",
"exam_id" : 3,
"topic" : "something",
"word_count" : 5,
"key_word_density" : 2,
"writer" : {
"user_id" : ObjectId("5b6959e3dc68d21c6613c77c"),
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
},
"editor" : {
"user_id" : 3,
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
},
"manager" : {
"user_id" : 3,
"versions" : [ 
{
"id" : 1,
"file_path" : "abcd"
}, 
{
"id" : 2,
"file_path" : "abcd"
}, 
{
"id" : 3,
"file_path" : "abcd"
}
]
}
}]
}]);

您可以尝试使用$filter聚合

db.collection.aggregate([
{ "$project": {
"exams": {
"$filter": {
"input": "$exams",
"as": "exam",
"cond": {
"$eq": [ "$$exam.writer.user_id", ObjectId("5b6959e3dc68d21c6613c77d") ]
}
}
}
}}
])

最新更新