【问题标题】:Convert values to keys mongodb aggregation [duplicate]将值转换为键 mongodb 聚合 [重复]
【发布时间】:2019-08-09 19:13:29
【问题描述】:

以下是聚合查询的结果:

[
    {
         "_id": "5a9433fee5878a000f7cba09",
         "trendingStats": {
            "trendingArr": [],
            "trendingScore": 0
         }
    },
   {
       "_id": "5a942f79e5878a000f7cba06",
       "trendingStats": {
          "trendingArr": [],
          "trendingScore": 0
       }
   }
]

这是查询:

collection.aggregate([
    {$project:{
         'trendingStats':{
           '$ifNull':['$trendingStats',{'trendingArr':[],'trendingScore':0}
         }
    }
]);

我希望结果是一个具有以下格式的文档:

{'5a9433fee5878a000f7cba09':{'trendingArr':[],trendingStats:0},
 '5a942f79e5878a000f7cba06':{'trendingArr':[],trendingStats:0},
}

有没有办法可以将结果转换成这样的一个文档?

【问题讨论】:

  • 我强烈建议您不要,就像链接副本的结尾一样。如果您的整个结果小于 16MB,您可以不用它,但是一旦将光标结果发送到客户端,只需“压缩文档”​​就可以更快、更清晰地编写代码。

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

您可以在$project之后使用以下阶段

{ "$group": {
  "_id": null,
  "data": {
    "$push": {
      "k": { "$toString": "$_id" },
      "v": "$trendingStats"
    }
  }
}},
{ "$replaceRoot": {
  "newRoot": { "$arrayToObject": "$data" }
}}

Output

[
  {
    "5a942f79e5878a000f7cba06": {
      "trendingArr": [],
      "trendingScore": 0
    },
    "5a9433fee5878a000f7cba09": {
      "trendingArr": [],
      "trendingScore": 0
    }
  }
]

【讨论】:

  • "k": { "$toString": "$_id" } - 没有它你会抛出一个异常,因为ObjectId 不是一个“字符串”。
  • @NeilLunn Yupss 你一如既往地是对的。更新了答案。
  • 遇到异常Unrecognized expression '$toString'
  • @user3302146 您必须拥有最新的 mongodb 版本,即 4.0。你在吗?
  • @AnthonyWinzlet 我想我会接受在客户端处理此问题的建议。感谢您的帮助。
猜你喜欢
  • 2019-03-15
  • 2022-01-22
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 2015-10-09
  • 2014-07-31
  • 2019-02-22
  • 2020-08-20
相关资源
最近更新 更多