2014-02-14 14 views
0

请帮我在这个复杂的mongodb查询。 我有一个XYZ收集文件记录为:Mongodb自加入添加字段之前显示(非常困难)也与java

{ key1:value1, 
    key2:value2, 
    key3:{ 
    docid:c78dfdfdf, 
    filename: "c78dfdfdf.xml" 
    } 
} 

{ key1:value1, 
    key2:value2, 
    key3:{ 
    docid:c7j9fdfdf, 
    filename: "c7j9fdfdf.xml" 
    } 
} 

{ key1:value1, 
    key2:value2, 
    key3:{ 
    docid:c7j9fdfdf, 
    filename: "c7j9fdfdf.gif" 
    } 
} 

{ key1:value1, 
    key2:value2, 
    key3:{ 
    docid:c7j9fdfdf, 
    filename: "c7j9fdfdf.jpg" 
    } 
} 

出于某种原因,这种结构不能改变。 现在我想发起一个查询,并获取所有记录与docid +“。xml”作为文件名,如第1条和第2条记录在这里,如果有任何其他具有相同docid的文档存在,它应该在所有结果中追加hasAttachment:“true”包含文件名为docid +任何其他扩展名,否则hasAttachment:“false”。对于例如查询应返回的没有更新只选择查询:

{ key1:value1, 
    key2:value2, 
    key3:{ 
    docid:c78dfdfdf, 
    filename: "c78dfdfdf.xml" 
    }, 
    hasAttachment:"false" 
} 

{ key1:value1, 
    key2:value2, 
    key3:{ 
    docid:c7j9fdfdf, 
    filename: "c7j9fdfdf.xml" 
    }, 
    hasAttachment:"true" 
} 

我需要查询和蒙戈的Java驱动程序代码来执行相同的操作。

首先,我想查询文件名= docid +“。xml”的所有文档,然后通过检查是否存在docid +非xml扩展名来添加hasAttachment = true/false。 感谢 尼廷

+0

能否请你加你已经尝试过什么已经使我们能够更有效地帮助吗? – WiredPrairie

+0

它需要聚合框架,我是一个初学者,我能够像db.XYZ.find({$其中:函数(){if(this.key3.fileName == this.key3.docid +“。xml” )返回false;否则返回true;}})。pretty()这是给我那些文件扩展名不是xml的文件 – nitinjaiswal

+0

但是我想在像foreach/aggregation这样的循环内运行所有的.xml扩展名文件名并添加如果在返回结果之前存在相同docid的其他扩展名文件,则hasAttachment = true – nitinjaiswal

回答

1

它可以很容易地与MapReduce完成:

db.runCommand({ 
    mapreduce: '<% YOUR COLLECTION NAME %>', 
    map: function() { 
    var id = this.key3.docid; 
    if (this.key3.filename === (id + '.xml')) { 
     emit(id, {doc: this}); 
    } else { 
     emit(id, {attach: true}); 
    } 
    }, 
    reduce: function(key, vals) { 
    return vals.reduce(function(o1, o2) { 
     return { 
     doc: o1.doc || o2.doc, 
     attach: o1.attach || o2.attach 
     }; 
    }); 
    }, 
    finalize: function(key, val) { 
    val.doc.hasAttachment = !!val.attach; 
    return val.doc; 
    }, 
    out: {inline: 1} 
}) 
+0

你解决了我的问题,使我的一天,这是工作....通过mongo java驱动程序完成一点点帮助是必需的... – nitinjaiswal

+0

您可以使用[DBCollection对象]的MapReduce方法(http:// api.mongodb.org/java/current/com/mongodb/DBCollection.html)。 –

+0

还有一个问题,如果有数百万条记录并且我想要设置一个限制,那么它将在有限集上执行这些操作,否则它将发出所有的键,然后在返回结果之前它会限制记录?因为对mapreduce应用限制,docid应该检查所有记录中的附件,这就是我想要的...... – nitinjaiswal