Агрегация MongoDB и $ lookup всегда возвращают пустой массив - PullRequest
0 голосов
/ 03 сентября 2018

Некоторое время я боролся с этим, не могу понять, почему я всегда получаю пустой массив для своих зацикленных данных.

У меня есть данные в моей коллекции пользователей

{
  storeid: 1,
  name: 'joe bloggs'
}

У меня есть коллекция магазинов со следующими данными в

{
  _id: ObjectId(1),
  storeName: 'Store name'
}

Я хочу получить имя, частью которого является каждый пользователь, при получении всех пользователей. У меня есть запрос, подобный приведенному ниже, чтобы сделать это:

User.aggregate([
  {
    $lookup: {
      from: "store",
      localField: "storeid",
      foreignField: "_id",
      as: "storeDetail"
    }
  }
])
.then(users => {
   res.send(users);
}).catch(err => {
  //error
});

Однако то, что я получаю, это то, что storeDetail всегда возвращает пустое значение. Не слишком уверен, что я делаю неправильно, я проверил правильность имен моей коллекции в соответствии с db.getCollectionNames () из оболочки mongo.

Спасибо

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Примечание: Вы упомянули неверную схему

{
  _id: ObjectId(1),
  storeName: 'Store name'
}

Вот решение

ObjectId (1) неверен. ObjectId всегда будет значением хеша 24 длины строки.

Коллекция пользователей:

{
    "_id" : ObjectId("5b8d246730739cd950b7b314"),
    "storeid" : ObjectId("5b8d249b30739cd950b7b323"),
    "name" : "joe bloggs"
}

Магазин Коллекция

{
    "_id" : ObjectId("5b8d249b30739cd950b7b323"),
    "storeName" : "Store name"
}

Монго-запрос

db.getCollection('user').aggregate([
{$lookup:{from: 'store',localField: 'storeid',foreignField: '_id',as: 'stores'}},
])

Результат

{
    "_id" : ObjectId("5b8d246730739cd950b7b314"),
    "storeid" : ObjectId("5b8d249b30739cd950b7b323"),
    "name" : "joe bloggs",
    "stores" : [ 
        {
            "_id" : ObjectId("5b8d249b30739cd950b7b323"),
            "storeName" : "Store name"
        }
    ]
}

Надеюсь, это поможет вам.

0 голосов
/ 03 сентября 2018

Оказывается, я пытался использовать разные типы схем в localField (string) и foreignField (ObjectId). Преобразование localField в модели для типа ObjectId исправило это.

type: String,//Didn't work
type: mongoose.Schema.Types.ObjectId,//Did work
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...