MongoDb嵌套对象选择

时间:2018-02-09 08:06:27

标签: node.js mongodb express mongodb-query

我有多个嵌套对象和列表,如下所示

{
 "_id": "5a76be26ca96e22f08af2a19",
 "testId": "123",
 "testName": "summerTest",
 "subjects": [
   {
     "subjectName": "Maths",
     "testDetails": [
     {
      "testNumber": "0001",
      "startTime": "2/18/18 13:30",
      "endTime": "2/18/18 13:30",
      "testDuriation": "01:00:00",
      "questions": [
        {...}
     ]
    },
     {
      "testNumber": "0002",
      "startTime": "2/18/18 13:30",
      "endTime": "2/18/18 13:30",
      "testDuriation": "01:00:00",
      "questions": [
        {...}
     ]
    }
  ]
}

我只想选择testNumber 0002。在我的快递中使用mongoclient。

collection.find({ "testId": "123", "subjects.subjectName": "Maths", "subjects.testDetails.testNumber": "0002" }).toArray(function (err, data) {}..

但它会返回整个TestId 123文档,任何人都可以帮助我。感谢

2 个答案:

答案 0 :(得分:0)

通过查找,您始终会返回整个文档,因此您需要添加投影才能显示所需内容。

顺便说一下,在find过滤器中有一个错误,因为如果你只想过滤具有特定subjects.subjectName和subjects.testDetails.testNumber的集合,你需要使用$ elemMatch(https://docs.mongodb.com/manual/reference/operator/query/elemMatch/)。如果你不这样做,它将返回所有文档,在subject数组中有一个元素包含第一个属性,另一个元素包含第二个属性。

答案 1 :(得分:0)

将可用

db.collection.aggregate([
          {$unwind : '$subjects'},
          {$project : {'_id': 0 , 'array' : '$subjects.testDetails'}},
          {$unwind : '$array'},
          {$match: {'array.testNumber' : '0002' }}
])