2017-10-12 94 views
1

内根据具体的情况,从阵列不同的值我有这样的文档集合:获取阵列

{ 
"_id" : ObjectId("59df91dae4b03289d79efb4e"), 
    "name" : "TEST", 
    "payload" : [ 
    { 
     "_id" : "ABC", 
     "status": "FALSE" 
    }, 
    { 
     "_id":"DEF", 
    "status": "TRUE" 
    }, 
    { 
     "_id" : "XYZ", 
    "status": "NULL" 
    } 
    ] 
} 

我试图找到所有具有的地位TRUE/FALSE的payload._id。 预期的结果是

["ABC","DEF"] 

到目前为止,我有这样的事情。

db.collection.distinct('payload._id',{"_id" : "TEST"}) 

不确定如何添加数组中元素的条件。

回答

0

查询条件与.distinct()适用于“docume NT选择“而不是包含在文档”内“的数组条目。如果你需要“过滤”数组内容,那么你应该使用.aggregate()来代替,以及一个小的后处理来获得数组响应中的“值”。

db.collection.aggregate([ 
    { "$match": { "_id": "TEST" } }, 
    { "$unwind": "$payload" }, 
    { "$match": { "payload.status": { "$in": ["TRUE","FALSE"] } } }, 
    { "$group": { "_id": "$payload._id" } }, 
]).map(d => d._id); 

存在的主要部分是因为你想从数组中的值以后使用为重点,以$group上这样做主要是$unwind流水线阶段。这基本上为每个数组成员生成一个新文档,但每个文档只包含该数组成员。它对包含数组的MongoDB结构是“反常规”。

接下来就是以下$match管道,它与任何查询一样工作,只选择符合条件的文档。由于所有数组成员现在都是“文档”,因此将不匹配的条目(作为文档)排除在外。你可以交替使用$filter来提取数据,但由于我们需要$unwind进行下一阶段,所以我们可能只需要$match

此时,您只剩下符合条件的数组条目。 $group是为了获得“不同的”值,所以通常你会通过更广泛的选择来做到这一点,而不仅仅是一个单一的文件或任何其中的值不是已经不同。所以这实际上保持了.distinct()的完全相同的行为。

最后,由于.aggregate()输出从.distinct()在设计它返回结果的“文件”的区别,我们只需使用.map()方法来处理光标结果和具体的文档属性仅返回“值”作为“阵列”。

+0

这工作。感谢您的解释。 修改map()方法如下,在RoboMongo上运行 map(function(u){return u。_ID; }) –

+0

@AtulPrasad如果它不理解箭头'=>'函数的ES6语法,那么您可能会有旧版本的RoboMongo。我建议你更新一下,因为还有与现代MongoDB版本兼容性的其他变化。也欢迎Stack Overflow。当您收到适合您问题的答案时[标记为已接受](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)以指示正确的答案。 –

1

我试图找到所有具有地位TRUE的payload._id/FALSE

要运行的查询是:

db.collection.distinct('payload._id', { 
    'payload.status': { $in: ["TRUE", "FALSE"] } 
}) 

一个更详细的方式它会是:

db.collection.distinct('payload._id', { 
    $or: [ 
    {'payload.status': "TRUE" }, 
    {'payload.status': "FALSE" } 
    ] 
}) 
+0

'.distinct()'中的查询条件不会“过滤”数组内容。 [查看答案](https://stackoverflow.com/a/46718902/2313887)。 –

+0

不起作用。谢谢! –