我如何访问的元素在一个阵列的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:我还没有实际执行的查询,但是上面应该给你一个想法,它需要怎么做。

+0

Mongodb 3.2有没有这样的选项? – user3138864