преобразовать _id дочерней коллекции в строку с помощью $set

#mongodb

#mongodb

Вопрос:

Вот как выглядят мои документы:

 Category:

_id:5f471cfb40868e7859587054
cat_name:"some category"
resource_owner:"test"


Item:
_id:5f471cfb40868e7859587044
item_name:"awesome item 1"
resource_owner:"test"

_id:5f471cfb40868e7859587099
item_name:"awesome item 2"
resource_owner:"test"
  

Я пишу агрегацию для извлечения записей из этих коллекций с помощью $lookup и $set для преобразования _id в строку. Это работает для родительской коллекции (категории), но не работает с дочерней коллекцией Item .

Вот как выглядит мой агрегированный конвейер:

 [
    {
        '$lookup': {
            'from': 'item', 
            'localField': 'resource_owner', 
            'foreignField': 'resource_owner', 
            'as': 'products'
        }
    }, {
        '$match': {
            '_id': ObjectId('5f471cfb40868e7859587054')
        }
    }, {
        '$set': {
            '_id': {
                '$toString': '$_id'
            }, 
            'products._id': {
                '$toString': '$_id' <--this sets parent's _id to child's _id
            }
        }
    }
]
  

Как мне изменить вышеуказанное $set , чтобы преобразовать _id дочерней коллекции в строку, возможно, без использования $unwind ?

Я использую mongodb 4.4

Ответ №1:

Вы можете попробовать оператор $map,

   {
    "$set": {
      "_id": { "$toString": "$_id" },
      "products": {
        $map: {
          input: "$products",
          in: {
            $mergeObjects: [
              "$$this",
              { _id: { $toString: "$$this._id" } }
            ]
          }
        }
      }
    }
  }
  

Игровая площадка