2016-04-04 9 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. 

}); 

Moğolla ilgili basit bir sorguda sorun yaşıyorum.

i ilk yeri her ihtiyaç yukarıdaki sorgu olarak sorgu ie ayarlanır: Bu iyi çalışır

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

, beklendiği gibi. Ancak, doc şeması değiştikçe bu sorguya eklemem gerekiyor.

Int1'in özel olduğu ve yalnızca kullanıcıya herkese gönderilmesi gereken yeni bir alan "gizlilik" var. Benim sorgudan görebileceğiniz gibi current_user_id sorgusu talebinde biriyse ben aksi takdirde sadece gizlilik içeren sonuçları getirir, herhangi bir gizlilik filtresi geçerli değildir,

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

yani söylemeye çalışıyorum 1 değil. current_user_id dahil tüm kullanıcılara 1 ...

DÜZENLEME tek yolu i istenen sonuç dev $ yapmaktır veya elde edebilirsiniz ama bu verimsiz hissediyor:

sorun $ ne uygulayarak olmasıdır :

Burada veyada

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 }    
    ] 
}) 

: Diğer user_id en

$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 } 
         ]} 
        ]}) 

cevap

1

dizisi Sen eşdeğer $or durumdur sadece "küçük bir bölümünü" var ki, burada bariz bileşik mantığı eksik görünüyor mantıktaki diğer "çimdik", "hideFromUserIds.id"'un 'un, zaten olduğu için "user_id" eşleşmesi için önemli olmayacağıdır. Aksi açıkça belirtilmediği sürece

TÜM MongoDB sorgu koşulları

"çoktan" bir "AND" koşuludur. Yani, $or'un "dışına" oturan her şey, $or ifadesinin "içinde" uygulanan argümanlara ek olarak "AND" ifadesi olarak kabul edilir.

$or içindeki tek şey, mantığın bozulmasında "diğer kullanıcılar" için geçerli olan koşullardır. Aksi takdirde her şey her durumda "AND" olarak uygulanır.

Sonunda şartları karıştırıyorsunuz. sonuçlarınız "Diğer sonuçlarına ek bu koşullardan ya" istediğim anlamına Çünkü ne zaman, o zaman aslında demek $or