генерировать уникальный идентификатор во вложенном документе - Pymongo - PullRequest
0 голосов
/ 29 апреля 2020

создать уникальный идентификатор во вложенном документе - Pymon go

моя база данных выглядит следующим образом ...

{
  "_id":"5ea661d6213894a6082af6d1",

  "blog_id":"blog_one",

  "comments":  [
          {
            "user_id":"1",
            "comment":"comment for blog one this is good"
          },
          {
            "user_id":"2",
            "comment":"other for blog one"
          },
  ]
}

Я хочу добавить уникальный идентификатор в каждый комментарий,

Я хочу, чтобы он выводил вот так:

{
  "_id":"5ea661d6213894a6082af6d1",

  "blog_id":"blog_one",

  "comments": [
           {
            "id" : "something"     (auto generate unique),
            "user_id":"1",
            "comment":"comment for blog one this is good"
           },
           {
            "id" : "something"    (auto generate unique),
            "user_id":"2",
            "comment":"other for blog one"
           },
     ]
}

Я использую PyMon go, есть ли способ обновить этот тип документа?

возможно или нет?

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Это обновление добавит уникальное значение идентификатора к каждому массиву comments с вложенными документами. Значение id рассчитывается на основе текущего времени в миллисекундах. Это значение увеличивается для каждого элемента массива, чтобы получить новое значение id для вложенных документов массива.

Код работает с MongoDB версии 4.2 и PyMon go 3.10.

pipeline = [
  { 
      "$set": {
         "comments": { 
             "$map": {
                 "input": { "$range": [ 0, { "$size": "$comments" } ] },
                 "in": {
                     "$mergeObjects": [ 
                         { "id": { "$add": [ { "$toLong" : datetime.datetime.now() }, "$$this" ] } },
                         { "$arrayElemAt": [ "$comments", "$$this" ] }
                     ]
                 }
             }
         }
      }
  }
]

collection.update_one( { }, pipeline )

Обновленный документ:

{
        "_id" : "5ea661d6213894a6082af6d1",
        "blog_id" : "blog_one",
        "comments" : [
                {
                        "id" : NumberLong("1588179349566"),
                        "user_id" : "1",
                        "comment" : "comment for blog one this is good"
                },
                {
                        "id" : NumberLong("1588179349567"),
                        "user_id" : "2",
                        "comment" : "other for blog one"
                }
        ]
}



[РЕДАКТИРОВАТЬ ДОБАВИТЬ]

Следующее работает из mongo shell. Он добавляет уникальный идентификатор для вложенных документов массива comments - уникальный для всех документов.

db.collection.aggregate( [
  { 
      "$unwind": "$comments" },
  { 
      "$group": { 
          "_id": null, 
          "count": { "$sum": 1 }, 
          "docs": { "$push": "$$ROOT"  },
          "now": { $first: "$$NOW" }
      } 
  },
  { 
      "$addFields": {
          "docs": { 
              "$map": {
                   "input": { "$range": [ 0, "$count" ] },
                   "in": {
                       "$mergeObjects": [ 
                           { "comments_id": { "$add": [ { "$toLong" : "$now" }, "$$this" ] } },
                           { "$arrayElemAt": [ "$docs", "$$this" ] }
                     ]
                 }
             }
         }
      }
  },
  { 
      "$unwind": "$docs" 
  },
  { 
      "$addFields": { 
          "docs.comments.comments_id": "$docs.comments_id" 
      } 
  },
  { 
      "$replaceRoot": { "newRoot": "$docs" } 
  },
  { 
      "$group": { 
          "_id": { "_id": "$_id", "blog_id": "$blog_id" }, 
          "comments": { "$push": "$comments" } 
      } 
  },
  { 
      $project: { 
          "_id": 0, 
          "_id": "$_id._id", 
          "blog_id": "$_id.blog_id", 
          "comments": 1 
      } 
  }
] ).forEach(doc => db.blogs.updateOne( { _id: doc._id }, { $set: { comments: doc.comments } } ) )
0 голосов
/ 29 апреля 2020

Вы можете использовать Конструктор ObjectId для создания идентификаторов и размещения их во вложенных документах.

...