2017-10-06 72 views
0

数组我们知道,如果我们想获得_id的数组,我们可以这样做:MongoDB的骨料项目返回_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]} 

更新: 这是我尝试用$组办

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

,但我仍然得到

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

或得到

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

后,我可以做.map(function(el) { return el._id }),但地图是客户端转换,我认为这会影响性能。

+0

能否请你把你的问题的“编辑”或“更新”标签的新更新的代码?我的回答可能会在你的问题中已经包含的印象下得到低估。 –

+0

对于'distinct()',您只需获取一组元素'[1,2]',而不是'{[1,2]}',因为您暗示这显然是无效的JSON。您可以操纵从聚合操作获得的结果以返回数组。 – chridam

+0

@chridam是[1,2]是我想要的,就像我提到的我不喜欢在客户端使用map来操作结果。 –

回答

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} 
    } 
]) 
+0

谢谢,为你解答。这也是我以前的尝试。但我想知道是否有一种方法来返回一个对象数组,就像我们做db.collections.distinct(“_ id”); –

+0

聚合将始终返回一个对象 –