mongodb - 将数组封装/转换为对象数组

标签 mongodb mongodb-query aggregation-framework

我目前正在修改架构,我需要使用聚合框架和 bulkWrite 进行相对简单的转换。 .

我希望能够获取这个数组:

{ 
     ...,
     "images" : [
        "http://example.com/...", 
        "http://example.com/...", 
        "http://example.com/..."
    ] 
}

并聚合到一个类似的数组,其中封装了原始值:

{ 
     ...,
     "images" : [
        {url: "http://example.com/..."}, 
        {url: "http://example.com/..."}, 
        {url: "http://example.com/..."}
    ] 
}

这个查询可以工作,但展开整个集合的成本却高得离谱。

[
    {
        $match: {}
    },
    {
        $unwind: {
            path : "$images",
        }
    },
    {
        $group: {
            _id: "$_id",
            images_2: {$addToSet: {url: "$images"}}
        }
    },
]

如何通过project或其他一些更便宜的聚合来实现这一点?

最佳答案

$map表达式应该可以完成这项工作,试试这个:

db.col.aggregate([
  {
    $project: {
      images: {
        $map: {
          input: '$images',
          as: 'url',
          in: {
            url: '$$url'
          }
        }
      }
    }
  }
]);

关于mongodb - 将数组封装/转换为对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41658785/

相关文章:

mongodb - 以编程方式更新 Mongo 和 Meteor 中的字段

javascript - 使用键名中的变量更新子文档属性

javascript - 为什么不在回调中使用函数?

node.js - 我可以在测试中连接到 mongoose 吗?

node.js - MongoDB 搜索匹配字符串部分的多个字段

javascript - UpdateOne mongodb 而不更改其他对象

javascript - 在 mongoDB 中创建一个 firebase 样式的权限层次结构

mongodb - 将 ISO 日期转换为 yyyy-mm-dd 格式

mongodb - 从展开的数组中获取最大值

node.js - 如何在 Mongodb 聚合(组)中进行 $sum 和 $filter