【发布时间】: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 进行异步调用时,为什么要让节点服务器忙碌?