我在MongoDB中保存了这样的BSON对象:
{
"title": "Chemistry",
"_id": "532d665f89ae4ae703b29730",
"__v": 0,
"sections": [
{
"week": 1,
"_id": "532d665f89ae4ae703b29731",
"assignments": [
{
"created_date": "2014-03-22T10:30:55.621Z",
"_id": "532d665f89ae4ae703b29733",
"questions": []
},
{
"created_date": "2014-03-22T10:30:55.621Z",
"_id": "532d665f89ae4ae703b29732",
"questions": []
}
],
"materials": []
}
],
"instructor_ids": [],
"student_ids": []
}
我想做的是使用_id 532d665f89ae4ae703b29731检索'赋值'。它是assignments数组中的一个元素,而该元素又是sections数组中的一个元素。
我可以使用查询
检索整个文档{'sections.assignments._id':assignmentId}
但是,我想要的只是赋值子文档
{
"created_date": "2014-03-22T10:30:55.621Z",
"_id": "532d665f89ae4ae703b29733",
"questions": []
}
有没有办法完成这样的查询?我应该决定在不同的集合中进行作业吗?
答案 0 :(得分:0)
要检索数组元素的子集,您需要使用$elemMatch
投影运算符。
db.collection.find(
{"sections.assignments._id" : assignmentId},
{"sections.assignments":{$elemMatch:{"_id":assignmentId}}}
)
注意:强>
如果多个元素与$ elemMatch条件匹配,则运算符返回数组中第一个匹配元素。
答案 1 :(得分:0)
你可以这样做一个聚合查询:
db.collection.aggregate(
{$unwind: "$sections"},
{$unwind: "$sections.assignments"},
{$match: {"sections.assignments._id": "532d665f89ae4ae703b29731"}},
{$project: {_id: false, assignments: "$sections.assignments"}}
)
但是,我建议你考虑创建更多的集合,就像你说的那样。 在我看来,更多的集合比这个查询更好。