mongodb使用java驱动程序比较两个不同的字段

mongodb使用java驱动程序比较两个不同的字段,java,mongodb,mapreduce,Java,Mongodb,Mapreduce,这是我插入的数据 {"_id" : ObjectId("4f97ebb5429c822f0506d9d8"), "direction" : "out", "status" : "complete", "inputfile" : "data", "messageid" :"mid_1","previousmessageid" : "previd_1"} {"_id" : ObjectId("4f97ebb5429c822f0506d9d8"), "direction" : "in", "sta

这是我插入的数据

{"_id" : ObjectId("4f97ebb5429c822f0506d9d8"), "direction" : "out", "status" : "complete",  "inputfile" : "data",  "messageid" :"mid_1","previousmessageid" : "previd_1"}
{"_id" : ObjectId("4f97ebb5429c822f0506d9d8"), "direction" : "in", "status" : "complete",  "inputfile" : "data1",  "messageid" :"0","previousmessageid" : "mid_1"}
现在我必须查询数据库,并在第一条记录中找到与方向为“in”的messageid相匹配的记录,在第二条记录中找到与方向为“out”的previousmessageid相匹配的记录。 我有大量的数据。请给我推荐一个获取记录的最佳方法。
提前感谢。

最简单的方法是提出两个问题:

  • 根据要查找“第一条记录”的任何条件查询该记录
  • 一旦有了“第一条记录”,您就可以使用它的
    messageid
    方向
    来查找第二组记录
  • 下面是一个使用MongoDB shell的示例,不过您可以将其转换为任何语言:

    > var firstRecord = db.collection.findOne({direction: "in", /* other criteria */})
    > var cursor = db.collection.find({previousmessageid: firstRecord["messageid"], direction: "out"})
    
    假设您有一个索引来为第一个查询提供服务,并且在
    {previousmessageid:1,direction:1}
    上有一个索引,那么这将非常有效

    编辑:由于您处理的是方向为“in”的多条记录,您可以稍微调整此技术以使其正常工作:

    > var inRecords = db.collection.find({direction: "in", /* other critiera */})
    > var messageIds = []
    > inRecords.forEach(function (record) { messageIds[messageIds.length] = record.messageid })
    > var cursor = db.collection.find({direction: "out", previousmessageid: {$in: messageIds}})
    > cursor.sort({previousmessageid: 1})
    > /* do something with cursor */
    

    然后,您可以处理对应用程序中所有消息的完整回复。

    很抱歉,我忘了在插入的记录中说,我还有两个字段“开始日期”和“结束日期”。对于查询数据库,我只从用户处获得“开始日期”和“结束日期”。在这种情况下,如果我获得messageid,然后再次查询数据库,会影响性能吗如果我只获取两个数组中的记录,然后将它们匹配,那就更好了。建议性能最好的一个数组。如果有更好的方法,请分享它。提前感谢基于起始日期和截止日期,您是否检索到一个或多个方向为“in”的记录?多个方向为“in”的记录然后我必须将“in”中的messageid字段与“out”中的前一个messageid字段进行比较