首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >mongodb中嵌套数组对象的展开和分组

mongodb中嵌套数组对象的展开和分组
EN

Stack Overflow用户
提问于 2018-05-25 09:25:59
回答 1查看 6.7K关注 0票数 2

在mongodb中,我有这样的数据结构:

代码语言:javascript
运行
复制
{
    "data" : [ 
        {
            "car" : [ 
                {
                    "model" : "aaa",
                }, 
                {
                    "model" : "bbb",
                }, 
                {
                    "model" : "ccc",
                }
            ],
            "user" : {
                "id" : "123"
            }
        }
    ],
}

我要分组计算汽车模型字段。所以首先我尝试了这样的展开方法:

代码语言:javascript
运行
复制
.aggregate([
  { $project: {"data.car.model":1, "data.user.id":1} },
  { $unwind: {
      path: "$data.car",
      preserveNullAndEmptyArrays: true
      } },
  { $group: {
      _id: "$data.car.model",
      count: { $sum: 1 }
      } }
])

但结果是:

代码语言:javascript
运行
复制
{
    "_id" : [ ["aaa", "bbb", "ccc"] ],
    "count" : 1.0
}

这不是我想要的,因为模型没有解开。我希望的结果是:

代码语言:javascript
运行
复制
[{_id:"aaa",count:1}, {_id:"bbb",count:1}, {_id:"ccc", count:1}]

然后,通过查看mongodb unwind array nested inside an array of documents,我尝试了嵌套数组$project:

代码语言:javascript
运行
复制
.aggregate([
  { $project: {"car":"$data.car.model", "user":"$data.user.id"} },
])

但结果是:

代码语言:javascript
运行
复制
{
    "car" : [ ["aaa", "bbb", "ccc"] ],
    "user" : ["123"]
}

正如您所看到的,car和用户被嵌入到一个数组中,我仍然不能应用$unwind方法。不过,我希望是这样:

代码语言:javascript
运行
复制
{
    "car" : ["aaa", "bbb", "ccc"],
    "user" : "123"
}

我使用的mongo是3.2,我在网上搜索了很多,但没有找到答案。是否有可能这样做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-25 09:28:11

您需要独立地$unwind “每个”数组:

代码语言:javascript
运行
复制
.aggregate([
  { "$unwind": { "path": "$data", "preserveNullAndEmptyArrays": true } },
  { "$unwind": { "path": "$data.car", "preserveNullAndEmptyArrays": true } },
  { "$group": {
    "_id": "$data.car.model",
    "count": { "$sum": 1 }
  }}
])

当你尝试的时候,你实际上不能“进入”和$unwind。因此,您首先“取消包装”外部数组,然后是“内部”数组。然后对文档进行整理以进行分组。

另一种方法可能是在“展开”之前使用$reduce“夷平数组”:

代码语言:javascript
运行
复制
.aggregate([
  { "$project": {
    "data": {
      "$reduce": {
        "input": "$data.car",
        "initialValue": [],
        "in": {
          "$concatArrays": [ "$$value", "$$this" ]
        }
      }
    }
  }},
  { "$unwind": "$data" },
  { "$group": {
    "_id": "$data.model",
    "count": { "$sum": 1 }
  }}
])

但是,这并不是真正的建议,因为“投影”更有可能涉及比对数组中的每个嵌套级别使用$unwind所产生的成本更高的费用。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50525825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档