MongoDB - Найти все записи из другой таблицы - PullRequest
0 голосов
/ 08 марта 2020

У меня есть следующие две таблицы:

Комментарии:

{
        "createdOn": "2020-03-08T04:19:20.276Z",
        "comment": "First comment in the app",
        "likesCount": 1,
        "_id": "5e6472c32fe18a59b1068f46",
        "userId": "5e60ec371dc3d30e61c6805b",
        "postId": "5e6356546d284c2cdfe1ad92",
        "__v": 0
    }

CommentLikes :

{
        "createdOn": "2020-03-08T06:47:58.855Z",
        "_id": "5e64955abb6056610f802159",
        "userId": "5e60ec371dc3d30e61c6805b",
        "commentId": "5e6472c32fe18a59b1068f46",
        "__v": 0
    }

Теперь я пытаюсь получить все лайки с помощью следующего запроса: -

Comments.aggregate([
    {$match: {postId : postId}},
    {$lookup:{
        from: 'commentLikes',
        localField: '_id',
        foreignField: 'commentId',
        as : 'likes'
    }}
    ])
.exec()

Он не возвращает ничего подобного. Ответ, который я получаю от этого запроса: -

{
        "_id": "5e6472c32fe18a59b1068f46",
        "createdOn": "2020-03-08T04:19:20.276Z",
        "comment": "First comment in the app",
        "likesCount": 1,
        "userId": "5e60ec371dc3d30e61c6805b",
        "postId": "5e6356546d284c2cdfe1ad92",
        "__v": 0,
        "likes": []
    }

Не знаю, что я делаю здесь неправильно. Пожалуйста помоги.

Ответы [ 2 ]

0 голосов
/ 08 марта 2020

Когда все сказали, что запрос в порядке, и проблема должна быть во имя коллекции. Затем я пытаюсь получить список своих коллекций с помощью следующего кода: -

mongoose.connection.on('open', function (ref) {
console.log('Connected to mongo server.');
//trying to get collection names
mongoose.connection.db.listCollections().toArray(function (err, names) {
    console.log(names); // [{ name: 'dbname.myCollection' }]
    module.exports.Collection = names;
});})

И я был удивлен, что mon goose изменил название всех коллекций на маленькие буквы. Название коллекции commentLikes стало commentlikes . Теперь мой запрос работает хорошо.

0 голосов
/ 08 марта 2020

Если тип поля _id в коллекции комментариев имеет тип ObjectId(), а если commentId в коллекции commentLikes является строкой, попробуйте следующий запрос:

Comments.aggregate([
    { $match: { postId: postId } },
    {
        $lookup:
        {
            from: "commentLikes",
            let: { id: { $toString: "$_id" } }, // Convert ObjectId() to string to match with type of commentId(string)
            pipeline: [
                {
                    $match:
                    {
                        $expr:
                            { $eq: ["$$id", "$commentId"] }
                    }
                }
            ],
            as: "likes"
        }
    }
])
    .exec()

Test: MongoDB-Playground

...