我如何访问的元素在一个阵列的mongodb
问题描述:
具有mongodb的文献如下面我如何访问的元素在一个阵列的mongodb
{
"_id" : ObjectId("213122423423423"),
"eventDateTimes" :
[
ISODate("2015-05-26T12:18:15.000Z"),
ISODate("2015-05-26T12:18:14.000Z"),
ISODate("2015-05-26T12:00:37.000Z"),
ISODate("2015-05-26T12:00:36.000Z")
],
"parseFlags" :
[
false,
"True",
false,
false
],
"eventMessages" : [
"Erro1 ",
"Error2",
"Error3",
"Error4"
]
}
}
提到我必须取基于parseFlags阵列上的eventMessages之一。
我必须得到parseFlags数组中的值为“false”的元素索引,然后将事件消息映射到这些索引。
结果应符合下列参数的文件,其中parseFlag是假的:
{
id,
EventDateTimes:[date1,date3,date4],
ParseFlags :[false,false,false]
eventMessages :[Error1,Error3,Error4]
}
能否请你让我知道如何得到这个输出?我正在使用mongodb 3.2。
答
MongoDB的3.4有一个群体基于索引
db.collectionName.aggregate({
$project: {
transposed: {
$zip: {inputs: ["$eventDateTimes", "$parseFlags", "$eventMessages"]
}
}
},
{$unwind: '$transposed'},
{$project: {eventDateTime: {$arrayElemAt: ['$tranposed',0]}, parseFlag:
{$arrayElemAt: ['$transposed', 1]}}}
{$match: {parseFlag: false}}
)
对于蒙戈3.2没有任何直接的方式来处理预期的查询数组元素的新数组运算符zip。您可以改为使用MapReduce的自定义代码
db.collection.mapReduce(function(){
var transposed = [];
for(var i=0;i<this.eventDateTimes.length;i++){
if(this.parseFlags[i]===false){
transposed.push({eventDateTime: this.eventDateTimes[i], parseFlag: this.parseFlags[i]});
}
}
emit(this._id, transposed);
}, function(key, values){
return [].concat.apply([], values);
}, {out: {inline:1}})
PS:我还没有实际执行的查询,但是上面应该给你一个想法,它需要怎么做。
Mongodb 3.2有没有这样的选项? – user3138864