首页 > 解决方案 > mongo 查询的格式化响应

问题描述

我看到一篇文章,我们可以使用 query:db.collection.find({"pc.pcId": "2"})并获取基于pcId. 结果:

{
  "name" : "user",
  "number":"09xxxxxxx21",
  "pc" : [{
      "pcId" : "1",
      "pcName" : "Desktop",
      "pcOwner" : "user1"
    }, {
      "pcId" : "2",
      "pcName" : "Laptop",
      "pcOwner" : "user1"
    }
  ]}
}

我的问题是,如果我想要这样的结果怎么办:

   {
      "pcId" : "2",
      "pcName" : "Desktop",
      "pcOwner" : "user1"
   }

不完整只记录我正在运行查询的特定结果。有什么疑问吗?

标签: mongodbmongoosemongodb-query

解决方案


您可以通过聚合来实现这一点。有几种方法

  1. $unwind展平阵列
  2. 使用匹配对象$match
  3. $replaceRoot有助于用对象替换整个文档

Mongo脚本如下

db.collection.aggregate([
  {
    "$unwind": "$pc"
  },
  {
    $match: {
      "pc.pcId": "2"
    }
  },
  {
    "$replaceRoot": {
      "newRoot": "$pc"
    }
  }
])

工作Mongo游乐场


第二种方式

  1. 用于$filter过滤期望的输出
  2. 获得过滤结果后,您可以使用数组的第一个元素获得所需的输出$arrayElemAt
  3. 如果 0 索引处没有元素,这将引发错误。为了防止它,我们使用$ifNull
  4. $replaceRoot有助于用对象替换整个文档

mongo脚本是

[
  {
    $project: {
      pc: {
        $ifNull: [
          {
            $arrayElemAt: [
              {
                $filter: {
                  input: "$pc",
                  cond: {
                    $eq: [
                      "$$this.pcId",
                      "1"
                    ]
                  }
                }
              },
              0
            ]
          },
          []
        ]
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": "$pc"
    }
  }
]

工作Mongo游乐场


推荐阅读