sql >> データベース >  >> NoSQL >> MongoDB

2つのフィールドの値が同じであるドキュメントを返す方法

    ここには2つのオプションがあります。 1つ目は、 $whereを使用することです。 オペレーター。

    Collection.find( { $where: "this.start === this.end" } )
    

    2番目のオプションは、集約フレームワークと$redact オペレーター。

    Collection.aggregate([
        { "$redact": { 
            "$cond": [
                { "$eq": [ "$start", "$end" ] },
                "$$KEEP",
                "$$PRUNE"
            ]
        }}
    ])
    

    $where 演算子はJavaScript評価を行い、インデックスを利用できないため、$whereを使用してクエリを実行します アプリケーションのパフォーマンスが低下する可能性があります。 考慮事項 を参照してください。 。 $ whereを使用すると、$ where操作の前に各ドキュメントがBSONからJavaScriptオブジェクトに変換され、パフォーマンスが低下します。もちろん、インデックスフィルタがあれば、クエリを改善できます。また、ユーザー入力に基づいて動的にクエリを作成する場合は、セキュリティ上のリスクがあります。

    $redact $whereのように インデックスを使用せず、コレクションスキャンも実行しませんが、$redactを実行すると、クエリのパフォーマンスが向上します。 これは標準のMongoDBオペレーターだからです。とはいえ、$ match演算子を使用してドキュメントをいつでもフィルタリングできるため、集計オプションの方がはるかに優れています。

    $where ここは問題ありませんが、回避できます。また、必要なのは$whereだけだと思います スキーマ設計の問題がある場合。たとえば、ここでは、インデックスを使用してドキュメントに別のブールフィールドを追加することをお勧めします。



    1. 成功するデータガバナンスの6つの重要な要素

    2. TornadoとRedisを非同期で使用するにはどうすればよいですか?

    3. 日付範囲のMongodbJavaクエリ

    4. mongoDBのいくつかのフィールドのインデックス作成