2017-12-19 5 views
0

Ich habe die folgenden Daten in einer MongoDB Sammlung users genannt:

{ 
    "_id" : ObjectID("5a3903562cdc59fad5fdc098"), 
    "name" : "Ana", 
    "hobbies" : [ 
     { 
      "title" : "kissing", 
      "with" : "pets" 
     }, 
     { 
      "title" : "playing", 
      "with" : "pets" 
     }, 
     { 
      "title" : "sleeping", 
      "with" : "pets" 
     } 
    ] 
} 
{ 
    "_id" : ObjectID("5a3903a32cdc59fad5fdc099"), 
    "name" : "Bart", 
    "hobbies" : [ 
     { 
      "title" : "hitting", 
      "with" : "pets" 
     }, 
     { 
      "title" : "beating", 
      "with" : "pets" 
     }, 
     { 
      "title" : "eating", 
      "with" : "pets" 
     } 
    ] 
} 

ich die Haustiere Wert aller with Schlüssel mit einem neuen Wert wie legos ersetzen müssen.

documentation der MongoDB für Version 3.6 besagt Folgendes:

The $[] operator can be used for queries which traverse more than one array and nested arrays.

Da jeder der with Tasten lebt innerhalb von zwei separaten Arrays $[] verwenden, sollten erreichen, was ich tun muss. Und auf einem Mac, es funktioniert perfekt, aber auf einem Windows-Rechner, bekomme ich diesen Fehler:

cannot use the part (hobbies of hobbies.$[].with) to traverse the element 

Beide Maschinen laufen MongoDB Shell-Version 3.6.0. Das Betriebssystem für den Mac ist macOS Sierra 10.12.6 und für den Windows-Rechner ist es Windows 10.

SO hat viele Fragen bezüglich des Positionsoperators und des Fehlers, den ich gerade bekomme. Aber keiner von ihnen adressiert, warum identische Operationen, die auf identischen Sammlungen ausgeführt werden, unter Windows fehlschlagen, aber auf Mac erfolgreich sind.

Ich habe die folgenden zwei Befehle versucht, um das Ergebnis zu erreichen, das ich brauche. Beide funktionieren auf dem Mac und beide scheitern bei Windows mit dem gleichen Fehler wie oben beschrieben.

db.users.updateMany({}, {$set: {"hobbies.$[].with": "legos"}}); 

und

db.users.update({}, {$set: {"hobbies.$[].with": "legos"}}, {multi: true}); 

Sie können Bildschirmaufzeichnungen der Differenz here sehen. Ich entschuldige mich im Voraus, dass der Text in der Aufnahme auf der Windows-Maschine auf der kleineren Seite ist.

Jede Hilfe zu verstehen, wie dies unter Windows zu lösen ist sehr willkommen.

+1

Können Sie db.version() auf beiden Betriebssystemen ausführen? Nur um die Serverversion zu bestätigen, sind sie auch gleich. – Veeram

+0

@Veuram, 'db.version()' gibt ** 3.6.0 ** auf beiden Rechnern zurück. –

+0

Bitte bestätigen Sie, dass es sich um dieselbe Datenbank handelt, mit der Sie sich von verschiedenen Systemen aus verbinden. Der Fehler besagt, dass es mindestens ein Dokument ohne "Hobbys" oder mit "Hobbys" gibt, das kein Array ist. Versuchen Sie 'db.users.updateMany ({hobbies: {$ type:" array "}}, {$ set: {" hobbies. $ []. Mit ":" legos "}});' –

Antwort

0

Ich kann nicht sagen, aber auf Fenster sieht es aus wie für die Abfrage Sie haben() anstelle von {}

+0

Ja, es ist schwer zu sehen, weil der Text so klein ist, aber sie sind '{}' nicht '()'. Danke fürs schauen, aber. –

0

Das gleiche Problem auch auf Linux existiert.

Ich bin mit Ubuntu 16.04, MongoDB 3.6.1

Es folgt die Ausgabe nach der [$] ausgeführt wird

{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 0 } 

PS: Ich habe nicht genug Ruf um einen Kommentar hinzufügen , also hier posten

Verwandte Themen