Вышла новая коллекция с числовым идентификатором последовательности после этапов в агрегате mongodb

Я пытаюсь собрать коллекцию после нескольких этапов конвейера агрегации MongoDB. выходная коллекция должна содержать идентификатор с числовым идентификатором последовательности (1,2,3,4 и т. д.).

db.getCollection('MY_COLLECTION').aggregate([{
    $addFields: {
      "dataEntries.targetCol1": "$dataEntries.col1",
      "dataEntries.targetCol2": "$dataEntries.col2"
    }
  },
  {
    $project: {
      "_id": 0,
      "dataEntries.col1": 0,
      "dataEntries.col2": 0,
      "dataEntries.col3": 0,
      "dataEntries.col4": 0
    }
  },
  {
    $unionWith: {
      coll: "MY_COLLECTION",
      pipeline: [{
          $addFields: {
            "dataEntries.targetCol1": "$dataEntries.col3",
            "dataEntries.targetCol2": "$dataEntries.col4"
          }
        },
        {
          $project: {
            "_id": 0,
            "dataEntries.col1": 0,
            "dataEntries.col2": 0,
            "dataEntries.col3": 0,
            "dataEntries.col4": 0
          }
        }
      ]
    }
  },
  {
    $out: "test_out"
  }
])

Коллекция результатов содержит objectId в качестве идентификатора.

/* 1 */
{
    "_id" : ObjectId("6239cb749482cf6b13248a80"),
    "dataEntries" : {
        "targetCol1" : "101-A",
        "targetCol2" : "101"
    }
}

/* 2 */
{
    "_id" : ObjectId("6239cb749482cf6b13248a81"),
    "dataEntries" : {
        "targetCol1" : "101-B",
        "targetCol2" : "101"
    }
}

Есть ли способ установить идентификатор для последовательного числового счетчика для каждого документа? Ожидаемые результаты:

/* 1 */
{
    "_id" : 1,
    "dataEntries" : {
        "targetCol1" : "101-A",
        "targetCol2" : "101"
    }
}

/* 2 */
{
    "_id" : 2,
    "dataEntries" : {
        "targetCol1" : "101-B",
        "targetCol2" : "101"
    }
}

Какую версию MongoDB вы используете?

Wernfried Domscheit 22.03.2022 14:33

версия - 4.4.2

Or Haim Sabag 22.03.2022 14:37
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
2
2
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В MongoDB 5.0 это очень просто:

db.collection.aggregate([
   {
      $setWindowFields: {
         sortBy: { _id: 1, },
         output: { _id: { $documentNumber: {} } }
      }
   }
])

В более ранних версиях это немного больше:

db.collection.aggregate([
   {
      $group: {
         _id: null, data: { $push: "$$ROOT" }
      }
   },
   {
      $set: {
         data: {
            $map: {
               input: "$data",
               in: {
                  $mergeObjects: ["$$this",
                     { _id: {$add: [{ $indexOfArray: ["$data._id", "$$this._id"] }, 1]} }
                  ]
               }
            }
         }
      }
   },
   { $unwind: "$data" },
   { $replaceWith: "$data" }
])

Большое спасибо, я обновил версию до 5.0.3, и первое решение работает как шарм.

Or Haim Sabag 22.03.2022 15:42

Другие вопросы по теме