Применить условие в $ lookup в mongodb - PullRequest
0 голосов
/ 28 сентября 2018

Я новичок в mongoDb.Я установил две коллекции.1) книга 2) комментарии

book : 
_id
title
author
posted
price

И комментарии:

_id
bookId
comment
status

Я хочу получить комментарий к этой книге, который имеет status = 1.

Я пробовал это.

return new promise((resolve, reject) => {
    db.collection('book').aggregate([
        {
            $lookup:{
                from:'comments',
                localField: "_id",
                foreignField: "bookId",
                as: "comments"                                                                  
            }
        }      
    ]).toArray().then((result) => {
        if(result.length > 0){
            res.send({ status: 1, message: "Success.", data:result });
        }else{
            res.send({ status: 0, message: "No data found." });
        }
    }).catch((err) => {
        res.send({ status: 0, message: "Something went wrong."});
    });
});

И когда я позвонил своему API, я получил это в почтальоне.

{
"status": 1,
"message": "Success.",
"data": [
    {
        "_id": "5bacad201bff841afb40791f",
        "title": "Game of thrones",
        "author": "John snow",
        "posted": "16/07/1995",
        "price": 1000,
        "comments": [
            {
                "_id": "5bacc31aa2d365256cab31ce",
                "bookId": "5bacad201bff841afb40791f",
                "comment": "Winter is comming"
            },
            {
                "_id": "5bacc3f65c716925df953615",
                "bookId": "5bacad201bff841afb40791f",
                "comment": "It has a level of politics"
            },
            {
                "_id": "5bacd60ea38cc526f1fee1d1",
                "bookId": "5bacad201bff841afb40791f",
                "comment": "It has a level of politics",
                "status": 1
            }
        ]
    },
    {
        "_id": "5bacad601bff841afb407920",
        "title": "Breaking bed",
        "author": "Haison burg",
        "posted": "20/08/2002",
        "price": 550,
        "comments": []
    }
]
}

Мне нужны данные, комментарии которых имеют значение статуса 1.Я пытался использовать $match после $lookup, но это не работает.Я также пытался использовать $eq, что также не работает для меня.Вполне возможно, что я установил это неправильно, потому что я только начал изучать mongodb.

Ответы [ 2 ]

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

Начиная с MongoDB v3.6.3 и выше, самая быстрая производительность запросов достигается следующим образом:

Убедитесь, что у вас есть индекс для полей bookId и status вколлекция comments:

db.comments.createIndex({ "bookId": 1, "status": 1 })

А затем используйте новый атрибут pipeline этапа $lookup (документация ):

db.books.aggregate([{
    "$lookup": {
        "from": "comments",
        "let": { "bId": "$_id" },
        "pipeline": [{
            "$match": {
                $expr: { $eq: [ "$bookId", "$$bId" ] },
                "status": 1
            }
        }],
        "as": "comments"
    }
}])
0 голосов
/ 28 сентября 2018

Вы можете использовать $addFields и $filter агрегирование здесь

db.collection("book").aggregate([
  { "$lookup": {
    "from": "comments",
    "localField": "_id",
    "foreignField": "bookId",
    "as": "comments"                                                                  
  }},
  { "$addFields": {
    "comments": {
      "$filter": {
        "input": "$comments",
        "cond": { "$eq": ["$$this.status", 1] }
      }
    }
  }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...