Получите новое поле int из существующего строкового поля - MongoDB - PullRequest
1 голос
/ 17 марта 2020

У меня есть коллекция документов, подобная следующей:

[
  {
    "_id" : NUUID("51611712-b966-4562-8937-06015a6691ec"),
    "Name":"NM-1",
    "DateCreated" : ISODate("2019-07-29T11:33:19.090Z"),
    "DateModified" : ISODate("2019-12-23T08:08:40.339Z"),
    "IsDeleted" : false,
  },
  {
    "_id" : NUUID("51611712-b966-4562-8937-06015a6691ec"),
    "Name":"NM-02",
    "DateCreated" : ISODate("2019-07-29T11:33:19.090Z"),
    "DateModified" : ISODate("2019-12-23T08:08:40.339Z"),
    "IsDeleted" : false,
  },
  {
    "_id" : NUUID("51611712-b966-4562-8937-06015a6691ec"),
    "Name":"NM-095",
    "DateCreated" : ISODate("2019-07-29T11:33:19.090Z"),
    "DateModified" : ISODate("2019-12-23T08:08:40.339Z"),
    "IsDeleted" : false,
  },
  {
    "_id" : NUUID("51611712-b966-4562-8937-06015a6691ec"),
    "Name":"NM-0096",
    "DateCreated" : ISODate("2019-07-29T11:33:19.090Z"),
    "DateModified" : ISODate("2019-12-23T08:08:40.339Z"),
    "IsDeleted" : false,
  },
  {
    "_id" : NUUID("51611712-b966-4562-8937-06015a6691ec"),
    "Name":"NM-105",
    "DateCreated" : ISODate("2019-07-29T11:33:19.090Z"),
    "DateModified" : ISODate("2019-12-23T08:08:40.339Z"),
    "IsDeleted" : false,
  },
  {
    "_id" : NUUID("51611712-b966-4562-8937-06015a6691ec"),
    "Name":"NM-0106",
    "DateCreated" : ISODate("2019-07-29T11:33:19.090Z"),
    "DateModified" : ISODate("2019-12-23T08:08:40.339Z"),
    "IsDeleted" : false,
  },
  {
    "_id" : NUUID("51611712-b966-4562-8937-06015a6691ec"),
    "Name":"NM-000109",
    "DateCreated" : ISODate("2019-07-29T11:33:19.090Z"),
    "DateModified" : ISODate("2019-12-23T08:08:40.339Z"),
    "IsDeleted" : false,
  },
  ...
]

Я хочу добавить новое поле в документы - Number, если оно не существует. Поле Number будет равно числу в поле Name без NM- и нулей.

Например после обработки:

[
  {
    "_id" : NUUID("51611712-b966-4562-8937-06015a6691ec"),
    "Name":"NM-1",
    "Number": 1,
    "DateCreated" : ISODate("2019-07-29T11:33:19.090Z"),
    "DateModified" : ISODate("2019-12-23T08:08:40.339Z"),
    "IsDeleted" : false,
  },
  {
    "_id" : NUUID("51611712-b966-4562-8937-06015a6691ec"),
    "Name":"NM-02",
    "Number": 2,
    "DateCreated" : ISODate("2019-07-29T11:33:19.090Z"),
    "DateModified" : ISODate("2019-12-23T08:08:40.339Z"),
    "IsDeleted" : false,
  },
  {
    "_id" : NUUID("51611712-b966-4562-8937-06015a6691ec"),
    "Name":"NM-095",
    "Number": 95,
    "DateCreated" : ISODate("2019-07-29T11:33:19.090Z"),
    "DateModified" : ISODate("2019-12-23T08:08:40.339Z"),
    "IsDeleted" : false,
  },
  {
    "_id" : NUUID("51611712-b966-4562-8937-06015a6691ec"),
    "Name":"NM-0096",
    "Number": 96,
    "DateCreated" : ISODate("2019-07-29T11:33:19.090Z"),
    "DateModified" : ISODate("2019-12-23T08:08:40.339Z"),
    "IsDeleted" : false,
  },
  {
    "_id" : NUUID("51611712-b966-4562-8937-06015a6691ec"),
    "Name":"NM-105",
    "Number": 105,
    "DateCreated" : ISODate("2019-07-29T11:33:19.090Z"),
    "DateModified" : ISODate("2019-12-23T08:08:40.339Z"),
    "IsDeleted" : false,
  },
  {
    "_id" : NUUID("51611712-b966-4562-8937-06015a6691ec"),
    "Name":"NM-0106",
    "Number": 106,
    "DateCreated" : ISODate("2019-07-29T11:33:19.090Z"),
    "DateModified" : ISODate("2019-12-23T08:08:40.339Z"),
    "IsDeleted" : false,
  },
  {
    "_id" : NUUID("51611712-b966-4562-8937-06015a6691ec"),
    "Name":"NM-000109",
    "Number": 109,
    "DateCreated" : ISODate("2019-07-29T11:33:19.090Z"),
    "DateModified" : ISODate("2019-12-23T08:08:40.339Z"),
    "IsDeleted" : false,
  },
  ...
]

Как написать для него скрипт MongoDB?

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Используя агрегационный конвейер, мы можем получить желаемый результат

Этапы конвейера - $ project и $ out необходимы

Операторы конвейера - * Требуется 1009 * $ substr и $ toInt

Запрос для получения результата

db.collection_name.aggregate([
    { $project: { 
        "Name":1, 
        "DateCreated" : 1, 
        "DateModified" : 1, 
        "IsDeleted" : 1,
        "Number" : {
             $toInt : { $substr : ["$Name", 3, -1] } 
           } 
       } 
    },
    {$out: "collection_name"}
  ]);

Обратите внимание:

В операции подстроки мы начинаем с 3 и заканчиваем -1 (если длина задана как отрицательное число, тогда mon go обработает остаток строки от начальной точки), так как мы начинаем с 3, этот запрос будет работать, если все Name в коллекции имеют префикс NM-.

Мы используем $ out для перезаписи всей коллекции с добавленным атрибутом Number

1 голос
/ 17 марта 2020

MongoDB 4.2+ имеет операторов агрегации конвейера , которые могут работать для вас.

db.collection.<update method>(
    {},
    [
        {"$set": {"newIntField": { $toInt: "$Name" }}}
    ]
)

Оформление заказа документы для получения более подробной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...