【问题标题】:Fetch mongo nested attributes as columns获取 mongo 嵌套属性作为列
【发布时间】:2019-06-01 15:04:02
【问题描述】:

下面是我的mongo结构

{ 
    "_id" : ObjectId("5bfbc18e28198e2f74e1d2d0"), 
    "address" : {
        "building" : "1007", 
        "coord" : [
            -73.856077, 
            40.848447
        ], 
        "street" : "Morris Park Ave", 
        "zipcode" : "10462"
    }, 
    "borough" : "Bronx", 
    "cuisine" : "Bakery"
}

在触发 db.Restaurant.find({"address.building":"1007"},{"address.building":1,"address.street":1,"address.zipcode":1}) 查询它给出的结果为

{ 
    "_id" : ObjectId("5bfbc18e28198e2f74e1d2d0"), 
    "address" : {
        "building" : "1007", 
        "street" : "Morris Park Ave", 
        "zipcode" : "10462"
    }
}

所以它仍然以嵌套文档的形式返回结果,但我想将这些嵌套属性作为列名而不想要嵌套结构。我该如何修改这个查询?

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    find查询只能限制字段。如果要重塑数据,则需要改用aggregation

    db.collection.aggregate([
      { "$match": { "address.building": "1007" }},
      { "$replaceRoot": { "newRoot": "$address" }},
      { "$project": { "coord": 0 }}
    ])
    

    【讨论】:

      【解决方案2】:

      您可以尝试以下聚合。它首先匹配您的任何条件,然后投射必要的字段,没有任何嵌套。

      db.test.aggregate([
          {
              $match : {
                  "address.building":"1007"
              }
          },
          {
              $project : {
                  building : "$address.building",
                  street : "$address.street",
                  zipcode : "$address.zipcode"
              }
          }
      ])
      

      输出:

      {
          "_id" : ObjectId("5bfbc18e28198e2f74e1d2d0"),
          "building" : "1007",
          "street" : "Morris Park Ave",
          "zipcode" : "10462"
      }
      

      如果这有帮助,请告诉我!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-26
        • 2023-01-04
        • 2020-08-16
        • 2010-11-05
        • 2014-04-13
        • 2019-10-14
        • 2011-09-17
        相关资源
        最近更新 更多