首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongodb中$lookup中的应用条件

mongodb中$lookup中的应用条件
EN

Stack Overflow用户
提问于 2018-09-28 07:23:15
回答 2查看 6.4K关注 0票数 5

我是mongoDb的新手。我已经设置了两个收藏品。( 1)第2卷)评论

代码语言:javascript
复制
book : 
_id
title
author
posted
price

评论意见是:

代码语言:javascript
复制
_id
bookId
comment
status

我想得到那些有status = 1的书的评论。

我试过这个。

代码语言:javascript
复制
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时,我从邮递员那里得到了这个。

代码语言:javascript
复制
{
"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,所以我把它设置得很错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-28 07:27:52

您可以在这里使用$addFields$filter聚合

代码语言:javascript
复制
db.collection("book").aggregate([
  { "$lookup": {
    "from": "comments",
    "localField": "_id",
    "foreignField": "bookId",
    "as": "comments"                                                                  
  }},
  { "$addFields": {
    "comments": {
      "$filter": {
        "input": "$comments",
        "cond": { "$eq": ["$$this.status", 1] }
      }
    }
  }}
])
票数 3
EN

Stack Overflow用户

发布于 2018-09-28 07:59:16

MongoDB v3.6.3开始,最快的查询性能将实现如下所示:

确保在bookId集合中的status字段和comments集合中有一个索引:

代码语言:javascript
复制
db.comments.createIndex({ "bookId": 1, "status": 1 })

然后使用$lookup stage (文档)的新的文档属性:

代码语言:javascript
复制
db.books.aggregate([{
    "$lookup": {
        "from": "comments",
        "let": { "bId": "$_id" },
        "pipeline": [{
            "$match": {
                $expr: { $eq: [ "$bookId", "$$bId" ] },
                "status": 1
            }
        }],
        "as": "comments"
    }
}])
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52550354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档