获取阵列
内根据具体的情况,从阵列不同的值我有这样的文档集合:获取阵列
{
"_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"})
不确定如何添加数组中元素的条件。
查询条件与.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()
方法来处理光标结果和具体的文档属性仅返回“值”作为“阵列”。
我试图找到所有具有地位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" }
]
})
'.distinct()'中的查询条件不会“过滤”数组内容。 [查看答案](https://stackoverflow.com/a/46718902/2313887)。 –
不起作用。谢谢! –
这工作。感谢您的解释。 修改map()方法如下,在RoboMongo上运行 map(function(u){return u。_ID; }) –
@AtulPrasad如果它不理解箭头'=>'函数的ES6语法,那么您可能会有旧版本的RoboMongo。我建议你更新一下,因为还有与现代MongoDB版本兼容性的其他变化。也欢迎Stack Overflow。当您收到适合您问题的答案时[标记为已接受](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)以指示正确的答案。 –