相关文章推荐
温文尔雅的圣诞树  ·  DAY25 MongoDB ...·  1 月前    · 
刀枪不入的马铃薯  ·  mongodb "errmsg" : ...·  1 月前    · 
纯真的炒饭  ·  MongoDB数据库中更新与删除数据 - ...·  1 月前    · 
开心的炒饭  ·  使用window.open()打开新窗口时携 ...·  1 年前    · 
迷茫的煎鸡蛋  ·  用electron打包前端应用初体验 - 知乎·  2 年前    · 
正直的番茄  ·  如何将Drawable转换为位图?·  2 年前    · 
拉风的闹钟  ·  wpf 关于 已多次设置属性content ...·  2 年前    · 
听话的棒棒糖  ·  java - Getting ...·  2 年前    · 
Code  ›  mongodb中嵌套数组对象的展开和分组开发者社区
对象数组 mongodb
https://cloud.tencent.com/developer/ask/sof/115142208
另类的火柴
2 年前
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
提问
问 mongodb中嵌套数组对象的展开和分组
Stack Overflow用户
提问于 2018-05-25 09:25:59
EN

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

{
    "data" : [ 
            "car" : [ 
                    "model" : "aaa",
                    "model" : "bbb",
                    "model" : "ccc",
            "user" : {
                "id" : "123"
}

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

.aggregate([
  { $project: {"data.car.model":1, "data.user.id":1} },
  { $unwind: {
      path: "$data.car",
      preserveNullAndEmptyArrays: true
  { $group: {
      _id: "$data.car.model",
      count: { $sum: 1 }
])

但结果是:

{
    "_id" : [ ["aaa", "bbb", "ccc"] ],
    "count" : 1.0
}

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

[{_id:"aaa",count:1}, {_id:"bbb",count:1}, {_id:"ccc", count:1}]

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

.aggregate([
  { $project: {"car":"$data.car.model", "user":"$data.user.id"} },
])

但结果是:

{
    "car" : [ ["aaa", "bbb", "ccc"] ],
    "user" : ["123"]
}

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

{
    "car" : ["aaa", "bbb", "ccc"],
    "user" : "123"
}

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

1 6.7K 0 票数 2
EN
mongodb
mongodb-query

回答 1

Stack Overflow用户

回答已采纳

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

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

.aggregate([
  { "$unwind": { "path": "$data", "preserveNullAndEmptyArrays": true } },
  { "$unwind": { "path": "$data.car", "preserveNullAndEmptyArrays": true } },
  { "$group": {
    "_id": "$data.car.model",
    "count": { "$sum": 1 }
])

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

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

.aggregate([
  { "$project": {
    "data": {
      "$reduce": {
        "input": "$data.car",
        "initialValue": [],
        "in": {
          "$concatArrays": [ "$$value", "$$this" ]
 
推荐文章
温文尔雅的圣诞树  ·  DAY25 MongoDB 自訂角色與使用者 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
1 月前
刀枪不入的马铃薯  ·  mongodb "errmsg" : "not master and slaveOk=false"的解决办法
1 月前
纯真的炒饭  ·  MongoDB数据库中更新与删除数据 - 龙恩0707
1 月前
开心的炒饭  ·  使用window.open()打开新窗口时携带数据(较长数据)_ 浏览器对url长度限制 _ 不同编码方式 - 字符与字节对应关系不同_window["filter"]-CSDN博客
1 年前
迷茫的煎鸡蛋  ·  用electron打包前端应用初体验 - 知乎
2 年前
正直的番茄  ·  如何将Drawable转换为位图?
2 年前
拉风的闹钟  ·  wpf 关于 已多次设置属性content 的报错_苦荞米的博客-CSDN博客
2 年前
听话的棒棒糖  ·  java - Getting android.app.ForegroundServiceStartNotAllowedException in Android 12 (SDK 31) - Stack Overflow
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号