【问题标题】:MongoDB aggregate project return an array of _id [duplicate]MongoDB聚合项目返回一个_id数组[重复]
【发布时间】:2023-03-21 13:54:01
【问题描述】:

我们知道,如果我们想获得一个 _id 数组,我们可以这样做:

db.collections.distinct("_id");

我的问题是,如果我需要用聚合做一个复杂的逻辑,我怎样才能得到一个 _id 数组。 例如:

db.getCollection('users').aggregate({
        $match : {
            is_register_completed : { $ne : true}
        }
    }
    //other operator like $lookup, $group
    ,
     {
         $project : {_id:1}
    }
     )

我明白了

{
"_id" : "1",
"_id" : "2"
}

我想要的就像我们做的与众不同

{[1,2]}

更新: 这就是我尝试用 $group 做的事情

db.getCollection('users').aggregate({
        $match : {
            is_register_completed : { $ne : true}
        }
    },
    {
        $group: {
        _id:null, all:{$addToSet: "$_id"}
        }
     }, {$project: {_id:0,all:1}}
     )

但我还是得到了

{
all : ["1","2"]
}

或者我可以在得到后做.map(function(el) { return el._id })

{
    "_id" : "1",
    "_id" : "2"
    }

,但是地图是客户端转换,我认为它会影响性能。

【问题讨论】:

  • 您能否在您的问题中为新更新的代码添加“编辑”或“更新”标签?我的回答可能会因为它已经包含在您的问题中而被否决。
  • 使用distinct(),例如,您只会得到一个元素数组[1, 2],而不是您暗示的{[1, 2]},这显然是无效的JSON。您可以操纵从聚合操作中获得的结果以返回数组。
  • @chridam yes [1,2] 是我想要的,就像我提到的那样,我不喜欢在客户端使用地图来操纵结果。
  • 标记的重复项回答了您的问题
  • 在 mongodb 上做尽可能多的事情。当您可以对 mongodb 进行异步调用时,为什么要让节点服务器忙碌?

标签: mongodb aggregate


【解决方案1】:

编辑: 引用自:How to return array of string with mongodb aggregation

无论你做什么,.aggregate() 方法总是返回对象 这不能改变。

原答案:
试试聚合框架:

db.myCol.aggregate([
    {
        $group:{_id:null, array:{$push:"$_id"}}
    },
    {
        $project:{array:true,_id:false}
    }
])

【讨论】:

  • 谢谢你的回答。这也是我曾经尝试过的。但我想知道有没有办法像我们一样返回一个对象数组 db.collections.distinct("_id");
  • 聚合总是返回一个对象
猜你喜欢
  • 2015-03-28
  • 2015-11-16
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 2012-08-31
  • 1970-01-01
相关资源
最近更新 更多