Это классическая проблема с тазобедренным монетом. Вероятно, то, что вам не хватает в вышесказанном, заключается в том, что вы всегда столкнетесь с тем, что при создании этого обновления за 1 шаг указали тот же самый field
. Вы должны будете сделать это в несколько этапов, так что логично:
db.collection.update({}, {$rename: { 'a': 'c' }})
db.collection.update({}, {$rename: { 'b': 'a' }})
db.collection.update({}, {$rename: { 'c': 'b' }})
Но мы можем сделать лучше, и избежать столкновения в двух шагах
db.collection.update({}, {$rename:{ 'a': 'c', 'b': 'd' }})
db.collection.update({}, {$rename:{ 'c': 'b', 'd': 'a' }})
Конечно, это не одна операция, и это не так просто и no вы не можете ссылаться на значение другого поля и обновлять его до другого.
И, конечно же, делайте это только там, где вам действительно необходимо изменить названия полей. Страница руководства $rename охватывает варианты использования. Если вы просто хотите видеть вещей таким образом, просто $project форму вы хотите:
db.collection.aggregate([{$project: { a: "$b", b: "$a" }}])
Не могу видеть, как это помогает на этот вопрос. Это одно обновление документа, как было указано. Возможно, это ** примечание ** принадлежит другому. –
Для конкретного вопроса, заданного здесь, преимущество действительно тривиально - одно круговое путешествие к серверу против двух. Для других приложений, которые могли бы использовать представленные здесь решения, экономия в обратном направлении к серверу для каждого переименованного поля может представлять интерес. –