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

时间:2012-04-25 14:20:26

标签: java mongodb mapreduce

这是我插入的数据。

{"_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"}

现在我必须查询数据库并找到与第一条记录中的messageid匹配的记录,其中方向为“in”,而previousmessageid则指向第二条记录中的方向“out”。 我有大量的数据。建议我一个最好的方法来获取记录。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

最简单的方法是进行两次查询:

  1. 根据您要查找该记录的任何条件查询“第一条记录”。
  2. 获得“第一条记录”后,您可以使用其messageiddirection“out”查找第二组记录。
  3. 以下是使用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 */
    

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