1

これは私が挿入したデータです。

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

ここで、データベースにクエリを実行し、最初のレコードのメッセージ ID が方向 "in" に一致し、previousmessageid が方向 "out" の 2 番目のレコードに一致するレコードを見つける必要があります。膨大な量のデータがあります。レコードを取得する最善の方法を教えてください。前もって感謝します。

4

1 に答える 1

0

最も簡単なのは、次の 2 つのクエリを作成することです。

  1. そのレコードを検索する基準に従って、「最初のレコード」を照会します。
  2. 「最初のレコード」を取得したら、そのレコードmessageiddirection「out」を使用して、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:方向が「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 */

その後、アプリケーション内のすべてのメッセージに対する返信の完全なセットを処理できます。

于 2012-04-25T14:33:05.740 に答える