2017-06-27 4 views
1

私の基本的な構造は、subjectIdとhourly priceを含むセッションオブジェクトを持つUserオブジェクトです。

User{ 
    defaultHourly: Number, 
    subjects{ 
     [ 
      id: String, 
      hourly: Number 
     ] 
    } 
}  

私はこのようなelemMatchを使用します。

query.elemMatch("subjects", { 
       "id": { $in: subjects }, 
       "$or": [ 
        { "hourly": { $eq: null } }, // this is my issue 
        { 
         "$and": [ 
          { "hourly": { $ne: null } }, 
          { "hourly": { $gte: price.low, $lte: price.high } } 
         ] 
        } 
       ] 
      }); 

elemMatchの最初の部分は、私が欲しいsubjectIdは、被験者の配列であることを確認します。それから私は価格でフィルタリングしたい。 Userがhourlyフィールドにnullを持つ場合、defaultHourlyとprice.lowおよびprice.highを比較したいと思います。

defaultHourlyはサブジェクトのフィールドではありませんが、サブジェクトの親のフィールドであるため、アクセス方法がわかりません。

私が書きたい:

"$or": [ 
      { 
       "$and": [ 
        { "hourly": { $eq: null } }, 
        { "defaultHourly": { $gte: price.low, $lte: price.high } } //this doesnt work because default hourly is not a field. 
       ] 
      }, 
      { 
       "$and": [ 
        { "hourly": { $ne: null } }, 
        { "hourly": { $gte: price.low, $lte: price.high } } 
       ] 
      } 
     ] 
}); 

がどのように私は、このマルチレベルの比較を行うことができますか?

答えて

1

$elemMatch以外の条件を記述し、$orをドキュメントの最上位に置きます。これは、それぞれが適用される条件の「設定」ことができます:

User.find({ 
    "$or": [ 
    { 
     "defaultHourly": { "$gte": price.low, "$lte": price.high }, 
     "subjects": { 
     "$elemMatch": { 
      "id": { "$in": subjects }, 
      "hourly": { "$eq": null } 
     } 
     } 
    }, 
    { 
     "subjects": { 
     "$elemMatch": { 
      "id": { "$in": subjects }, 
      "hourly": { "$gte": price.low, "$lte": price.high } 
     } 
     } 
    } 
    ] 
}) 

それは単に実際の数値「より大きい」ではありませんので、また、「範囲」の比較は、実際にnullを否定するであろうから$neは、必要とされていません。

また、すべてのMongoDBクエリ式は同じプロパティの$gte$lteなどのAND条件であることに注意してください。明示的な$andの必要性を取り除く

"hourly": { "$gte": price.low, "$lte": price.high, "$ne": null } 

:それは必須ではありませんのでにもかかわらず、$neとしても中に書き込むことができます。

関連する問題