2017-06-18 6 views
2

Ich erhalte diese Fehlermeldung:

"Unrecognized logical operator: $in"

während diese Abfrage mit:

this.update(
      {}, { 
       $pull: { 
        words: { 
         $in:['string', 'string1'] 
        } 
       } 
      }, { 
       multi: true 
      }); 

ich innerhalb einer es6 Klasse bin aufrufen, die erweitert Mongo.Collection im Client, alles andere bisher (Einfügen, Entfernen) hat funktioniert und ich ändere die Update-Methode in keiner Weise. Die Sammlung ist ein local collection auf diese Weise erklärt:

WordsList = new WordCollection('words', {connection: null});)

Die Abfrage ist sehr ähnlich wie das Beispiel in der Dokumentation here und eigentlich kann ich den gleichen Fehler zu reproduzieren, während versuchen, dieses Beispiel auf der Konsole als auch neu zu erstellen.

I'm using Meteor 1.4.4.1 with MongoDB 3.2.12

Aus irgendeinem Grund kann ich noch nach unten nicht stecken, kann ich den Fehler zu Mongo Verfolgen Sie die Abfrage-Mapping es zu logischen Operatoren ($ und $ oder) anstelle des Elements (Vergleich Abfrage) Betreiber zusammenzustellen ($ in, $ eq)

+1

Ich glaube nicht, Meteor, diese Art von Update ermöglicht, ohne dass ein bestimmtes Dokument '_id'. Auch funktioniert möglicherweise nicht in Minimongo im Browser-Client, aber das ist gültige Syntax "Server-Seite". Vielleicht sollten Sie eine Servermethode verwenden. –

+0

Nun, das Beispiel in der Dokumentation gibt keine ID weiter, es soll auf alle passenden Dokumente angewendet werden. Auch (vergessen zu erwähnen) ist dies eine clientseitige Sammlung (passiere {verbindung: null} als zweites Argument), werde dies im Beitrag aktualisieren. – lvlzqz

+0

Ich denke, Sie verwechseln Dokumentationsquellen hier. Die MongoDB-Kerndokumentation listet die korrekten Syntaxoptionen für $ pull auf. Dies ist eine gültige Anweisung. Meteor ['.update()'] (https://docs.meteor.com/api/collections.html#Mongo-Collection-update) als implementiert betrachtet "nicht vertrauenswürdigen" Client-Code als nicht gültig, wenn er ein bestimmtes Dokument nicht enthält '_id'. Sofern Sie die Methode nicht speziell abgesichert haben, wäre dies nicht erlaubt. Ich denke, dass Sie dies wirklich als eine [Server-Methode] ausführen müssen (https://guide.meteor.com/methods.html) –

Antwort

1

Es ist möglich, mehrere Werte in einer lokalen Sammlung zu ändern, jedoch gibt es eine Einschränkung bei der Verwendung von Selektoren oder Modifikatoren, wie die clientseitige Sammlungsbenutzer MiniMongo, die eine Teilmenge der MongoDB-Funktionalität.

Dieser Fall ist ein Manko der MiniMongo, wo eine logische Matcher in $pull Ausdrücken verwendet wird, wie es in einem Kommentar in der Umsetzung $pull angegeben:

// XXX Minimongo.Matcher isn't up for the job, because we need 
    // to permit stuff like {$pull: {a: {$gt: 4}}}.. something 
    // like {$gt: 4} is not normally a complete selector. 
    // same issue as $elemMatch possibly? 

(source : Meteor source code)

Das ab 2013 ist, so gibt ist nicht viel Hoffnung, dass es sich ohne eine PR ändert.

Insbesondere ermöglicht der Matcher nur die Verwendung logischer Selektoren: "$and", "$or", "$nor", "$where", "$comment". Deshalb können Sie $in, das in ELEMENT_OPERATORS implementiert ist, nicht verwenden.

Als Abhilfe kann (und da diese nur Client-Seite ist), können Sie verwenden:

valueArray.forEach(val => WordsList.update({}, {$pull: {words: val}}, {multi: true})); 
+0

Vielen Dank dafür! Ich habe leider noch nicht genug Ruf, um dich zu wählen, aber du artikuliert das Schuldige und stellte eine funktionierende Lösung dar. – lvlzqz

+0

Frage weiter und du wirst bald :) Wie auch immer, wenn diese Antwort das Problem löst, kannst du akzeptieren die Antwort. – MasterAM

+0

Sieht so aus, als ob ich ziemlich nah dran bin! – lvlzqz