Переименование поля MongoDb _id

У меня есть коллекция с именем «summary» в лазурном космосе db, а поле _id для моей коллекции - «orderId». В моей коллекции миллионы пластинок. Теперь я хочу переименовать поле _id 'orderId' в 'PurchaseOrderId' (в соответствии с дизайном бизнес-домена). Эта коллекция имеет индекс _id.orderId. Для достижения этого прямого подхода нужно отказаться от сбора и перезагрузить с новым именем поля id, но это стоит дороже, а также требует много времени, поскольку необходимо перезагрузить миллионы данных. Итак, есть ли способ добиться этого, обновив имя поля _id для переименования (путем получения существующей записи и выполнения обновления переименования) с помощью spring mongotemplate или драйвера mongodb 3.11.1.

имя поля старого идентификатора: 'orderId',

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

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

Версия Mongo db: 3.6

Структура документа Mongo

{
    "_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,
    ... 
    ..
    ... 
}

person Priya    schedule 26.02.2020    source источник


Ответы (1)


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

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

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

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

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

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

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