2016-05-31 5 views

答えて

2

あなたはJavaScriptの式に渡すことができます$where演算子を使用することができ、次のいずれか

db.getCollection('rss').find({ "$where": "this.duplicates > (this.total_count * 5)" }) 
// sama as db.getCollection('rss').find("this.duplicates > (this.total_count * 5)") 

またはを集約フレームワークを使用します$cmp演算子は、上記よりもはるかに効果的です$whereを単独で使用すると、コレクションを実行する必要がありますsca各文書はBSONからJavaScriptオブジェクトに変換され、$whereの式を実行する必要があります。 $whereの式を満たすためにインデックスを使用することはできません。したがって、パフォーマンスが大幅に低下し、クエリがはるかに遅くなります。それは2つの値を比較し、最初の値が2番目の値より小さい場合は

  • -1を返すよう、あなたにはるかに優れたパフォーマンスを提供します$cmp演算子を使用して


  • 最初の値が2番目の値より大きい場合は1。
  • 2つの値が等しい場合は0。

だからあなたの最後のクエリは次のようになります。

db.getCollection('rss').aggregate([ 
    { 
     "$project": { 
      // Project other fields as required 
      "duplicates": 1, 
      "total_count": 1, 
      "isGreater": { 
       "$cmp": [ 
        "$duplicates", 
        { "$multiply": [ "$total_count", 5 ] } 
       ] 
      } 
     } 
    }, 
    { "$match": { "isGreater": 1 } } 
]) 
関連する問題