2012-04-25 2 views
1

これは私が挿入したデータです。mongodbは、Javaドライバを使用して2つの異なるフィールドを比較します

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

は、今私は、DBを照会し、第二のレコードの方向「アウト」とし、previousmessageid「の」方向で最初のレコードのメッセージIDに一致するレコードを見つける必要があります。 私は膨大な量のデータを持っています。最高の方法でレコードを取得してください。ありがとうございます。

答えて

0

一番簡単な方法は、2つのクエリ作ることになります:あなたは、そのレコードを見つけたいものは何でも基準に従って「最初のレコード」のために

  1. クエリを。
  2. "最初のレコード"を取得したら、messageiddirectionを "出力"して2番目のレコードセットを見つけることができます。あなたはどの言語にもかなり自明これを変換することができますがここで

は、MongoDBのシェルを使用した例です:

> var firstRecord = db.collection.findOne({direction: "in", /* other criteria */}) 
> var cursor = db.collection.find({previousmessageid: firstRecord["messageid"], direction: "out"}) 

これは、あなたが最初のクエリを提供するためのインデックス、およびインデックスを持っていると仮定すると、効率的になります{previousmessageid: 1, direction: 1}にあります。

EDIT:あなたが方向「における」で複数のレコードを扱っているので、あなたが仕事に少しこの手法を調整することができます。

> 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 */ 

あなたはその後、すべてのメッセージに応答の完全なセットを処理することができますあなたのアプリケーションで。

+0

申し訳ありませんが挿入されたレコードで言うことを忘れてしまいました。私は日付と日付から2つのフィールドを持っています.dbを取得するために、私はuser.In dateから取得します。 dbはもう一度パフォーマンスに影響を与えますか、2つの配列でレコードを取得してから一致させると良いでしょう。パフォーマンスの最高のものを忘れないでください。より良いアプローチがあれば、共有してください。事前にお礼します – vikasse

+0

ベース日付から日付までに、 "in"という方向の1つ以上のレコードを取得しますか? – dcrosta

+0

方向が "in"のレコードが複数ある場合、 "in"のmessageidフィールドと "out"の以前のmessageidフィールドを比較する必要があります。 – vikasse

関連する問題