4

javascriptを使用してmongoDBの隣接するレコードの違いを取るにはどうすればよいですか? たとえば、コレクションに次の 3 つのドキュメントがあるとします。

{
    "_id" : ObjectId("50ed90a55502684f440001ac"),
    "time" : ISODate("2013-02-13T15:45:41.148Z")
}

{
    "_id" : ObjectId("50ed90a55502684f440001ad"),
    "time" : ISODate("2013-02-13T15:45:42.148Z")
}

{
    "_id" : ObjectId("50ed90a55502684f440001ae"),
    "time" : ISODate("2013-02-13T15:45:45.148Z")
}

取得する隣接する値間の「時間」フィールドの差を取得したい:

{
    "_id" : ObjectId("50ed90a55502684f440001ac"),
    "time" : ISODate("2013-02-13T15:45:41.148Z"),
    "time_difference" : null
}

{
    "_id" : ObjectId("50ed90a55502684f440001ad"),
    "time" : ISODate("2013-02-13T15:45:42.148Z"),
    "time_difference" : 1
}

{
    "_id" : ObjectId("50ed90a55502684f440001ae"),
    "time" : ISODate("2013-02-13T15:45:45.148Z"),
    "time_difference" : 3
}

javascript/mongoDB でこれを効率的に行う方法についてのアイデアはありますか? ありがとう。

4

4 に答える 4

2

ここで確認したいことの 1 つは、レコードを装飾するために使用したいクエリに並べ替えがあることです。並べ替えが使用されていない場合、実際には順序ではなく検索順序が使用されます$natural

検索順序はクエリによって異なる場合があるため、2 分間に 2 回クエリを実行すると、同じ順序が返されないことがあります。ただし、クエリは で論理的にソートされるようですtiem_difference

これは、通常のクエリでは不可能であることにも注意してください。また、集約フレームワークを介してこれを行う簡単な方法もわかりません。

したがって、次のもっともらしい方法は、複数のクエリを使用するか、クライアント側の処理を使用することです。ここでは、上記の @Marlon で定義されているような関数を使用したクライアント側の処理がおそらく優れています。

于 2013-02-14T14:45:13.087 に答える
1

これらの 3 つのオブジェクトが配列に入ると仮定すると、次のようなことができます。

var prevTime;
var currentTime;

for(var i = 0; i < records.length; i++)
{
    currentTime = new Date(records[i].time).getTime();
    records[i].time_difference = currentTime - prevTime;
    prevTime = currentTime;
}

もちろん、mongo のレコードを使用するには、ビットを交換する必要があります。

より複雑な日付計算を行う必要がある場合は、datejsを確認することを強くお勧めします (必要に応じてノード ラッパーを入手できます)。

于 2013-02-14T14:42:59.183 に答える
1

一つ、クリアしたい。MYSQL とは異なり、MongoDB は位置を保証しません。つまり、MongoDB は異なる時期に異なるソートを提供します。したがって、隣接するドキュメントを比較すると、読み取りごとに異なる結果が得られる場合があります。

それで問題がなく、比較したい場合は、MongoDB の MapReduce http://docs.mongodb.org/manual/applications/map-reduce/を試してください。

于 2013-02-14T14:32:23.010 に答える