如何在MongoDB中使用嵌入式文档(使用Mongoose)

时间:2014-03-22 14:30:32

标签: javascript arrays node.js mongodb mongoose

我在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": []
}

有没有办法完成这样的查询?我应该决定在不同的集合中进行作业吗?

2 个答案:

答案 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"}}
)

但是,我建议你考虑创建更多的集合,就像你说的那样。 在我看来,更多的集合比这个查询更好。