【问题标题】:MongoDb nested object selection [duplicate]MongoDb嵌套对象选择[重复]
【发布时间】:2018-07-19 22:53:03
【问题描述】:

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

{
 "_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。在我的 express js 中使用 mongoclient。

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

但它会返回整个 TestId 123 文档任何人帮助我。谢谢

【问题讨论】:

标签: node.js mongodb express mongodb-query


【解决方案1】:

使用 find 时,您总是会返回整个文档,因此您需要添加投影以仅显示您需要的内容。

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

【讨论】:

    【解决方案2】:

    将可用

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

    【讨论】:

      猜你喜欢
      • 2018-11-07
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 2016-04-19
      • 2016-06-25
      • 2018-11-10
      相关资源
      最近更新 更多