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

}); 

Ich habe Probleme mit einer scheinbar einfachen Abfrage in Mongo.

Die obige Abfrage i alle der ersten Partie müssen in der Abfrage dh werden als Set:

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

Dies funktioniert gut, wie erwartet. Ich muss diese Abfrage jedoch hinzufügen, da sich das Doc-Schema geändert hat.

Es gibt ein neues Feld "privacy" wo int 1 ist privat und sollte nur an den Benutzer an alle zurückgegeben werden. Wie Sie aus meiner Anfrage sehen i

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

also ist versucht zu sagen, wenn die current_user_id derjenige ist die Abfrage anfordert, führen Sie einen Privacy-Filter nicht anwenden, da sonst nur Dokumente mit der Privatsphäre Rückkehr nicht 1 ist.

das Problem ist, dass es bewirbt $ ne: 1 für alle Benutzer einschließlich der current_user_id ...

EDIT die einzige Art, wie ich das gewünschte Ergebnis erzielen kann, ist ein riesiges $ zu tun oder aber das fühlt sich ineffizient :

wo oder ist eine Reihe anderer user_id des

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

Antwort

1

Sie scheinen die offensichtliche Verbindung Logik hier zu fehlen, in denen es nur einen „kleinen Teil“ ist, dass die äquivalente $or Bedingung ist:

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

Wo der andere "zwicken" in der Logik ist, dass "hideFromUserIds.id" wird nicht auf die current_user_id als das Spiel zu "user_id", da es schon sie ist.

ALLE MongoDB Abfragebedingungen sind „schon“ eine Bedingung „AND“, wenn nichts anderes ausdrücklich angegeben ist. Alles, was "außerhalb" der $or sitzt, wird zusätzlich zu den Argumenten, die innerhalb des Ausdrucks "$or" angewendet werden, als "UND" -Ausdruck betrachtet.

Also die einzigen Dinge in der $or sind die Bedingungen, die "andere Benutzer" in der Aufschlüsselung der Logik gelten würde. Ansonsten wird alles andere als "AND" in allen Fällen angewendet.

Am Ende verwirren Sie die Begriffe. Denn wenn Ihre Ergebnisse bedeuten, Sie wollen entweder dieser Bedingungen in zusätzlich zu den anderen Ergebnissen“, dann meinen Sie eigentlich $or

Verwandte Themen