Невозможно использовать агрегат в пн goose с nodejs - PullRequest
1 голос
/ 14 февраля 2020

У меня есть две коллекции в mongodb с именами 'users' и 'posts'

пользователи выглядят так: -

[
    {
      "_id": "5e3ffba65bad3a38dc0509cd",
      "name": "Ekansh Jain",
      "email": "ejekanshjain@gmail.com",
      "password": "$2a$10$lF1evuJgfC0N7fIC4I7KrOG.lq56aiHzndIYwc/YRb3auLTgHfmGK",
      "createdAt": "2020-02-09T12:31:34.117Z",
      "updatedAt": "2020-02-09T12:31:34.117Z",
      "__v": 0
    },
    {
      "_id": "5e403dcd1000793694bd2276",
      "name": "Ekansh Jain",
      "email": "ejekanshjain2@gmail.com",
      "password": "$2a$10$qGmng4KrXVXKt0RLnSMgMueo.BenKM43QIpURrzxW4M.HGDHe//TC",
      "createdAt": "2020-02-09T17:13:49.508Z",
      "updatedAt": "2020-02-09T17:13:49.508Z",
      "__v": 0
    }
]

сообщения выглядят так

[
    {
      "_id": "5e403aa22a28e430b0d2641a",
      "title": "My Post 1",
      "body": "this is my first post's body",
      "createdBy": "5e3ffba65bad3a38dc0509cd",
      "createdAt": "2020-02-09T17:00:18.991Z",
      "updatedAt": "2020-02-09T17:00:18.991Z",
      "__v": 0,
      "userInfo": []
    },
    {
      "_id": "5e403e8b1000793694bd2278",
      "title": "LOL",
      "body": "LOL",
      "createdBy": "5e403dcd1000793694bd2276",
      "createdAt": "2020-02-09T17:16:59.513Z",
      "updatedAt": "2020-02-09T17:16:59.513Z",
      "__v": 0,
      "userInfo": []
    },
    {
      "_id": "5e46c8cfe56d4325b4e8d334",
      "title": "test Post",
      "body": "this is my first post's body",
      "createdBy": "5e3ffba65bad3a38dc0509cd",
      "createdAt": "2020-02-14T16:20:31.771Z",
      "updatedAt": "2020-02-14T16:20:31.771Z",
      "__v": 0,
      "userInfo": []
    }
]

В моем приложении nodejs express есть две модели mon goose с именами User и Post.

Я не могу объединить (не могу применить внутреннее объединение к сообщениям и пользователю)

Вот код, который я сейчас использую: -

const posts = await Post.aggregate([
            {
                "$lookup": {
                    "from": "users",
                    "localField": "createdBy",
                    "foreignField": "_id",
                    "as": "userInfo"
                }
            }
        ]).exec()

В результате он возвращает массив объектов записей с пустым объектом userInfo. Может ли кто-нибудь помочь мне с этим ...

1 Ответ

0 голосов
/ 14 февраля 2020

Поскольку createdBy является строкой & _id имеет тип ObjectId(), тогда Вам нужно привести оба поля к одному и тому же типу, попробуйте это:

Post.aggregate([
    {
        $lookup:
        {
            from: "users",
            let: { createdBy: "$createdBy" },
            pipeline: [
                {
                    $match:
                    {
                        $expr:
                            { $eq: [{ $toObjectId: "$$createdBy" }, "$_id"] }
                    }
                }
            ],
            as: "userInfo"
        }
    }
])

Тест: MongoDB-Playground

Примечание: В качестве альтернативы, если вы не хотите конвертировать их каждый раз, когда вам нужно сохранить createdBy как ObjectId().

Поэтому в вашей Post модели createdBy тип должен быть Schema.Types.ObjectId.

при сохранении Post document createdBy : mongoose.Types.ObjectId('someString');

...