2016-04-07 12 views
2

Ich habe ein Dokumente wie folgt aus:Wie alle Schlüssel in mongodb umzubenennen?

{ 
    "_id" : ObjectId("5705fe62d0d50b2316617508"), 
    "date" : ISODate("2016-04-07T11:12:43.917Z"), 
} 
{ 
    "_id" : ObjectId("5705fe62d0d50b2316617508"), 
    "date" : ISODate("2016-04-07T11:12:43.917Z"), 
    "XString" : "bb" 
} 
{ 
    "_id" : ObjectId("5705fe62d0d50b2316617508"), 
    "date" : ISODate("2016-04-07T11:12:43.917Z"), 
    "XString" : "ba" 
} 
{ 
    "_id" : ObjectId("5705fe62d0d50b2316617508"), 
    "date" : ISODate("2016-04-07T11:12:43.917Z"), 
    "XString" : "dd" 
} 

wie i-Taste „XString“ aktualisieren „Name“ und wenn die XString es sollte mit $ Umbenennungs nicht da hinzufügen „Name“

versucht wie:

db.articles.update({}, {$set:{$rename: {'XString':'Name'}}},{upsert:true}); 

aber es gibt Fehler wie:

The dollar ($) prefixed field '$rename' in '$rename' is not valid for storage. 

Versuchte andere Art und Weise:

db.articles.update({}, {$rename: {'XString': 'Name'}}, false, true); 
but its not adding the key is it does not exists 

Antwort

1

Wenn Ihre MongoDB-Server-Version ist 3.2 Sie können die Verwendung Methode. Natürlich müssen Sie $exists und $rename wie bereits erwähnt in this answer verwenden. Auch die Methode updateMany() akzeptiert nicht die Option "multi".

Last but not least wichtigsten Treiber deprecate die update() Methode seit der Version 3,0

Die folgende Abfrage Umbenennungs "XString" auf "Name", wobei "XString" existiert.

db.articles.updateMany(
    { "XString": { "$exists": true } }, 
    { "$rename": { "XString": "Name" } } 
) 

Um Standardwert festgelegt, wo die "XString" nicht vorhanden ist, verwenden Sie die $set Update-Operator.

3

Falsche Option. Sie wollen "multi" und nicht "upsert":

db.articles.update(
    { "XString": { "$exists": true } }, 
    { "$rename": { 'XString': 'Name' } }, 
    { "multi": true } 
); 

Der $exists Test stellt sicher, dass Sie nur Dokumente der Auswahl, wo der Schlüssel Sie Umbenennung tatsächlich da ist.

Auch $rename ist ein "Update Modifier", was bedeutet, es ist ein "Top Level" -Argument des "Update" -Dokuments.

Die "multi" bedeutet, dass alle übereinstimmenden Dokumente, anstatt nur die "erste".

Wenn Sie einen „leeren“ Wert, wo der Schlüssel tatsächlich nicht existiert, dann tun Sie das Gegenteil, und vorzugsweise nach dem $rename Betrieb:

db.articles.update(
    { "Name": { "$exists": false } }, 
    { "$set": { 'Name': '' } }, 
    { "multi": true } 
); 
+0

es funktioniert wie: db.articles.update ({}, {$ rename: {'XString': 'Name'}}, false, true); müssen Name Schlüssel hinzufügen, wenn es nicht da ist ... ist das möglich? –

+0

@HarjeetJadeja Sie benötigen das '$ exists' im Abfrageteil –

Verwandte Themen