2016-04-04 11 views
1
modelThreader.find({ 
     $and: [ 
      {"date_entered": { $lt: fromTime }}, 
      {"cancelled": { $ne: true }}, 
      {"hideFromUserIds.id": { $ne: current_user_id }}, 
      {"banned": false}, 
      {$and: [ 
       {"user_id": { $ne: current_user_id }}, 
       {"privacy": { $ne: 1 }} 
      ]} 
     ] 
    }).exec(function(err, docs){ 

    // handle response. 

}); 

mongoで一見単純なクエリで問題が発生しています。

上記のクエリ私は、クエリIEのセットのように第1のロットのすべてを必要とする:

{"date_entered": { $lt: fromTime }}, 
{"cancelled": { $ne: true }}, 
{"hideFromUserIds.id": { $ne: current_user_id }}, 
{"banned": false}, 

予想通りこれは、正常に動作します。しかし、docスキーマが変更されたので、このクエリに追加する必要があります。

新しいフィールド「プライバシー」があります。この場合、int1はプライベートであり、全員にのみユーザーに返す必要があります。あなたは私のクエリから見ることができるようにcurrent_user_idがクエリを要求するものであり、任意のプライバシーフィルタを適用していない、そうでない場合は、唯一のプライバシーとドキュメントを返すことは1でない場合、私は、

{$and: [ 
    {"user_id": { $ne: current_user_id }}, 
    {"privacy": { $ne: 1 }} 
]} 

すなわち言うしようとしています。 current_user_idを含むすべてのユーザーに対して1 ...

EDIT 唯一の方法私は、所望の結果は巨大な$を行うことですか達成することができますが、これは非効率的な感じ:

問題は、$ NEが適用されていることです:

modelThreader.find({ 
    "date_entered": { "$lt": fromTime }, 
    "cancelled": { "$ne": true }, 
    "banned": false, 
    "$or": [ 
    { "user_id": current_user_id }, 
    { 
     "user_id": { "$ne": current_user_id }, 
     "hideFromUserIds.id": { "$ne": current_user_id }, 
     "privacy": { "$ne": 1 }    
    ] 
}) 

:他のuser_idの

$or: [ 
         {$and: [ 
          //other people, respecting privacy 
          {$or: or}, 
          {"date_entered": { $lt: fromTime }}, 
          {"cancelled": { $ne: true }}, 
          {"hideFromUserIds.id": { $ne: current_user_id }}, 
          {"banned": false}, 
          {"user_id":   { $ne: current_user_id }}, 
          {"privacy":  { $ne: 1 }} 
         ]}, 
         {$and: [ 
          //this user, not looking at privacy 
          {"date_entered": { $lt: fromTime }}, 
          {"cancelled": { $ne: true }}, 
          {"hideFromUserIds.id": { $ne: current_user_id }}, 
          {"banned": false}, 
          {"user_id": current_user_id } 
         ]} 
        ]}) 

答えて

1

の配列は、あなたは同等$or条件でのみ「ごく一部」が存在する、ここでは明らかに化合物のロジックが欠けているように見えますロジック内の他の "微調整"は、すでにへの一致としてcurrent_user_idと一致していないので、"hideFromUserIds.id"はそれがあります。特に明記しない限り、

ALL MongoDBのクエリ条件

"すでに" "AND" 状態です。したがって、 $orの「外側」に座っているものは、 $or式内に適用された引数に加えて、「AND」式と見なされます。

したがって、$or内の唯一のものは、「他のユーザー」のロジックの内訳に該当する条件です。それ以外の場合は、すべてが「AND」として適用されます。

最後に、あなたは用語を混乱させています。あなたの結果はあなたが「他の結果に加えにこれらの条件のいずれかをしたい意味する場合ので、あなたが実際に意味$or

関連する問題