2016-05-10 15 views
4

2つのフィールドで同じ値を持つコレクション内の文書だけを見つけることはできますか?2つのフィールドが同じ値を持つ文書を返す方法

としてここに
{ 
    _id: 'fewSFDewvfG20df', 
    start: 10, 
    end: 10 
} 

startend同じ値を持って、この文書が選択されることになります。

私は何かendが値なければならないとして、動作しないような...

Collection.find({ start: { $eq: end } }) 

...について考えます。

答えて

5

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

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

第2のオプションは、集約フレームワークと$redact演算子を使用することです。

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

どちらが良いですか?

$whereオペレータは、JavaScriptの評価を行い、アプリケーションにおけるパフォーマンスの低下を引き起こす可能性がありますので、クエリ$whereを使用して索引を利用することはできません。 considerationsを参照してください。 $ whereを使用すると、それぞれの文書がBSONからJavaScriptオブジェクトに変換され、$ where操作の前に実行されると、パフォーマンスが低下します。もちろん、インデックスフィルタがあればクエリを改善することができます。また、ユーザーの入力に基づいてクエリを動的に構築する場合、セキュリティ上のリスクがあります。

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

$whereここで問題はありませんが、避けることができます。また、スキーマ設計に問題がある場合は、$whereしか必要ではないと思います。たとえば、インデックス付きのドキュメントに別のブール値フィールドを追加すると、ここでは良いオプションになります。

0

以上の関数呼び出しが含まれているため、このクエリは、高速であり、

Collection.find("this.start == this.end"); 
関連する問題