MongoDb _id поле переименовать - PullRequest
       10

MongoDb _id поле переименовать

0 голосов
/ 26 февраля 2020

У меня есть коллекция с именем 'summary' в azure cosmos db, и поле _id для моей коллекции - 'orderId'. У меня есть миллионы записей в моей коллекции. Теперь я хочу переименовать свое поле _id 'orderId' в 'purchaseOrderId' (в соответствии с дизайном бизнес-домена). Эта коллекция имеет индекс _id.orderId. Чтобы достичь этого, достаточно просто отказаться от сбора и перезагрузки с новым именем поля идентификатора, но это стоит дороже, а также требует больше времени, так как требует перезагрузки миллионов данных. Таким образом, есть ли способ добиться этого путем обновления имени поля _id для переименования (путем извлечения существующей записи и обновления переименования) с помощью Spring Mongotemplate или Mongodb Driver 3.11.1.

старое имя поля id: 'orderId',

рекомендуемое имя идентификатора: 'purchaseOrderId',

Существующий индекс: '_id.orderId',

Пн go дБ версия: 3,6

Пн go структура документа

{
    "_id" : {
        "orderId" : 10164
    },
    "countryCode" : null,
    "sequenceNumber" : "5693",
    "deptNumber" : "92",
    "type" : "20",
    "addrNumber" : 12,
    "venNumber" : 0,
    "shipPtDescr" : "                              ",
    "whsNumber" : "6001",
    "purchId" : 1006,
    "statCode" : "C",
    "groceryId" : "N",
    "openToBuyMonth" : 12,
    "updateSource" : "MF",
    "authorizedDate" : null,
    "deposit" : null,
    "cost" : null,
    "boardCode" : null,
    "authorizedBy" : null,
    ... 
    ..
    ... 
}

1 Ответ

0 голосов
/ 26 февраля 2020

К сожалению, _id является неизменяемым полем в MongoDB, и оно не позволяет изменять _id документа после его вставки.

Вот поведение поля _id , как указано в этой ссылке :

_id Поле
После установки вы не сможете обновить значение поля _id также нельзя заменить существующим документом с документом замены, у которого есть другое значение поля _id.

В качестве обходного пути, позвольте MongoDB создать свой собственный _id поле при добавлении другого поля (скажем, custom_id вне поля _id ), на которое ваше приложение будет ссылаться и использовать.

{
    "_id" : Object("xxxxxxxxxxxxxxxx"),
    "custom_id" : {
        "orderId" : 10164
    },
    "countryCode" : null,
    "sequenceNumber" : "5693",
    ...
    ...
}

Здесь вы можете переименовать поле как

db.collection.updateMany( {}, { $rename: { "custom_id.orderId": "custom_id.purchaseOrderId" } } )
...