Агрегирование запросов MongoDB строка ObjectFid localField и внешнее поле ObjectId - PullRequest
0 голосов
/ 03 апреля 2020

Моя цель - объединить 2 коллекции, в одной из которых, а именно в пользовательской коллекции, у меня есть массив строкового типа objectid, который представляет фактические идентификаторы в другой коллекции, а именно коллекцию изображений. Я использую следующий код

    await dbConn()
    return User.aggregate([
       {
           $match:{_id: mongoose.Types.ObjectId(id)}
       },
       {
           $unwind:'$imgIds'
       },

       {
           $lookup:{
               from:'images',
               localField:'imgIds',
               foreignField:'_id',
               as:'imgObjs'
           }
       }
    ],(err,res)=>console.log(res))
}

, поэтому в коллекции пользователей есть совпадение одного элемента. затем деконструкция массива imgIds и попытка установить связь между ними с помощью lookup, тогда как localField - это строка, а _id - это ObjectId. В результате ImgOb js - пустой массив.

Есть мысли по этому поводу? Я использую версию Mon go 3.6.12

------------ РЕДАКТИРОВАТЬ --------------

Я обнаружил что-то очень странное в поведении моего сервера. Когда я делаю простой вызов findById, мой элемент изображения является массивом ObjectId. Но при использовании агрегата ObjecIds становятся String. У кого-нибудь есть идеи, что здесь?

1 Ответ

0 голосов
/ 03 апреля 2020

Вам необходимо преобразовать ваши строки в идентификаторы объектов (или ваши идентификаторы объектов в строку).

Для пн go версия 4.0 или выше

Вы можете использовать $toObjectId для этого. В вашем случае вы можете добавить этап $addFields после раскрутки:

{
  $addFields: {
    imgIdObjId: { $toObjectId: $imgIds }
  }
}

В вашем поиске вам нужно будет использовать это поле вместо imgIds:

{
  $lookup:{
    from:'images',
    localField:'imgIdObjId',
    foreignField:'_id',
    as:'imgObjs'
  }
}

Для ссылка на оформление заказа: https://docs.mongodb.com/manual/reference/operator/aggregation/toObjectId/

...