Скопируйте и переименуйте поле документа в MongoDB - PullRequest
0 голосов
/ 13 февраля 2019

Я хочу переименовать поле, которое есть у всех документов в моей коллекции Mongo. На этот вопрос уже есть отличный ответ .Но вместо того, чтобы перезаписать текущее имя свойства, я хочу сохранить переименованное свойство как новое поле, оставив исходное без изменений.

Представьте, что мои документы выглядят так:

{
  "property": "Original property value"
}

Я хочучтобы получить это:

{
  "property": "Original property value",
  "property_new": "Original property value"
}

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Вы просто перебираете элементы коллекции в оболочке mongo и обновляете каждый документ, т.е. добавляете новые атрибуты в виде функции property_new в forEach, как показано ниже:

db.st5.find().forEach(function(o) { db.st5.update({"_id":o._id}, {$set: {"property_new": o.property} } )})

Перед обновлением я вставляю один документ вколлекция st5 как:

> db.st5.insert({
...   "property": "Original property value"
... })
WriteResult({ "nInserted" : 1 })
> db.st5.find()
{ "_id" : ObjectId("5c643368b913e399ee84b4f8"), "property" : "Original property value" }

И затем перебирая каждый элемент и обновляя, как показано ниже:

> db.st5.find().forEach(function(o) { db.st5.update({"_id":o._id}, {$set: {"property_new": o.property} } )})
> db.st5.find()
{ "_id" : ObjectId("5c643368b913e399ee84b4f8"), "property" : "Original property value", "property_new" : "Original property value" }
> 

Надеюсь, это решит вашу проблему.

0 голосов
/ 13 февраля 2019

Вы можете использовать $out агрегация

db.collection.find([
  { "$addFields": {
    "property_new": "$property"
  }},
  { "$out": "newCollection" }
])

Это создаст новую коллекцию с именем newCollection, просто переименуйте ее с существующей.

...