0

そのため、イベントの開始時刻と終了時刻を格納するコレクションがあり、ユーザーが「フィルター」の開始時刻と終了時刻を指定してイベントを照会できるようにしたいと考えています。クエリは、フィルター時間と交差するすべてのイベントを返す必要があります。クエリを正しく作成していると思っていましたが、必要な結果が返されません。

サンプルデータ (アイデアを得るために単純化された mongo ドキュメント、時間は HHMMSS):

{ ..., "start" : "050520", "end" : "051309" } //Should match
{ ..., "start" : "051125", "end" : "051925" } //Should match
{ ..., "start" : "052049", "end" : "052420" } //Should match
{ ..., "start" : "050000", "end" : "050500" }
{ ..., "start" : "052100", "end" : "052721" }

私が試したクエリは次のとおりです(ここで括弧を逃した場合は許してください。それは問題ではありません):

find( { $or : [ 
            { start : { $gte : "050600", $lt : "052100" } }, 
            { end : { $lt : "052100", $gt : "050600" } } 
        ] } )

3 つの結果のうちの 1 つだけが返されました。$or パーツの順序を切り替える (開始時間の前に終了時間に対してクエリを実行する) と、2 つの結果が得られますが、3 つすべてではありません。複合クエリの場合、クエリの2番目の部分を適用する前に、最初の部分と一致しない結果をmongoが破棄することを読んだことを覚えているようですが、 $or 演算子がそれを処理すると思いました。何か案は?私のクエリは間違っていますか? これは mongo でのクエリの制限ですか?

4

2 に答える 2

4

MongoDB 2.4.5 を使用して上記を試したところ、どちらの場合も「一致する必要がある」結果の最初の 2 つが返されました。

("052049" >= "050600" && "052049" < "052000") または ("052420" < "052000" && "052420" > "050600")どちらも true と評価されません。

MongoDB shell version: 2.4.5
connecting to: test
> 
> db.mycol.save({ "start" : "050520", "end" : "051309" }) 
> db.mycol.save({ "start" : "051125", "end" : "051925" })
> db.mycol.save({ "start" : "052049", "end" : "052420" }) 
> db.mycol.save({ "start" : "050000", "end" : "050500" })
> db.mycol.save({ "start" : "052100", "end" : "052721" })
>
> db.mycol.find( 
... { $or : 
... [ { $and : [ { start : { $gte : "050600" } }, { start : { $lt : "052000" } } ] }, 
...   { $and : [ { end : { $lt : "052000" } }, { end : { $gt : "050600" } } ] } 
... ] 
...     } )
{ "_id" : ObjectId("520528522683a40682f12b5c"), "start" : "050520", "end" : "051309" }
{ "_id" : ObjectId("520528522683a40682f12b5d"), "start" : "051125", "end" : "051925" }
> 
> 
> db.mycol.find( 
... { $or : 
... [     { $and : [ { end : { $lt : "052000" } }, { end : { $gt : "050600" } } ] } , 
...   { $and : [ { start : { $gte : "050600" } }, { start : { $lt : "052000" } } ] }
... ] 
...     } )
{ "_id" : ObjectId("520528522683a40682f12b5c"), "start" : "050520", "end" : "051309" }
{ "_id" : ObjectId("520528522683a40682f12b5d"), "start" : "051125", "end" : "051925" }
> 
于 2013-08-09T17:49:36.683 に答える
1

クエリは正常に動作するはずですが、3 番目のクエリは両方とも一致してはならず、範囲外です。startend

ただし、次のようにクエリをより明確かつ簡潔に記述できます。

db.test.find({ $or: [
    { start: { $gte: "050600", $lt : "052000" }}, 
    { end: { $lt: "052000", $gt: "050600" }}
]});
于 2013-08-09T17:53:18.557 に答える