88

そのため、グループ メンバーシップを追跡する埋め込みドキュメントがあります。各埋め込みドキュメントには、別のコレクション内のグループを指す ID、開始日、およびオプションの有効期限があります。

グループの現在のメンバーを照会したい。「Current」は、開始時刻が現在時刻よりも短く、有効期限が現在時刻よりも大きい、または null であることを意味します。

この条件付きクエリは、私を完全にブロックしています。2 つのクエリを実行して結果をマージすることでそれを行うこともできますが、それは見苦しく、すべての結果を一度に読み込む必要があります。または、有効期限を遠い将来の任意の日付にデフォルト設定することもできますが、それはさらに醜く、もろくなる可能性があります。SQL では、"(expires >= Now()) OR (expires IS NULL)" で表現するだけですが、Mongo でそれを行う方法がわかりません。

何か案は?よろしくお願いします。

4

6 に答える 6

135

将来誰かがこのページに出くわした場合に備えて、更新すると思いました. 1.5.3 の時点で、mongo は実際の $or 演算子をサポートするようになりました: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or

「(expires >= Now()) OR (expires IS NULL)」のクエリは、次のようにレンダリングできるようになりました。

{$or: [{expires: {$gte: new Date()}}, {expires: null}]}
于 2010-07-02T05:59:55.383 に答える
70

www.querymongo.comは、OR 句を含め、SQL と MongoDB 間の変換を行います同等の SQL を知っていると、構文を理解するのに非常に役立ちます。

OR文の場合はこんな感じ

SQL:

SELECT * FROM collection WHERE columnA = 3 OR columnB = 'string';

モンゴDB:

db.collection.find({
    "$or": [{
        "columnA": 3
    }, {
        "columnB": "string"
    }]
});
于 2012-12-13T16:37:09.270 に答える
12

「or」条件を使用した MongoDB クエリ

db.getCollection('movie').find({$or:[{"type":"smartreply"},{"category":"small_talk"}]})

「or」、「and」、条件を組み合わせた MongoDB クエリ。

db.getCollection('movie').find({"applicationId":"2b5958d9629026491c30b42f2d5256fa8",$or:[{"type":"smartreply"},{"category":"small_talk"}]})
于 2020-06-20T16:30:16.107 に答える
4

Mongo では、デフォルトで AND 式を組み合わせてオブジェクトをクエリします。Mongo には現在、そのようなクエリの OR 演算子は含まれていませんが、そのようなクエリを表現する方法はあります。

「で」または「どこで」を使用します。

次のようになります。

db.mycollection.find( { $where : function() { 
return ( this.startTime < Now() && this.expireTime > Now() || this.expireTime == null ); } } );
于 2010-01-05T18:16:07.390 に答える
2

$whereインデックスを使用できないため、クエリの使用は遅くなります。この種の問題については、「expires」フィールドに高い値を格納する方が良いと思います。これは当然、常に Now() よりも大きくなります。何百万年も先の非常に高い日付を格納するか、別の型を使用して決して表示しないようにすることができます。クロスタイプのソート順はhereで定義されています。

空の Regex または MaxKey (言語でサポートされている場合) はどちらも適切な選択です。

于 2010-01-20T23:33:16.093 に答える