首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB:检查对象数组,如果存在返回true,否则为false

MongoDB:检查对象数组,如果存在返回true,否则为false
EN

Stack Overflow用户
提问于 2019-05-10 07:01:05
回答 2查看 3.3K关注 0票数 5

我正在尝试查询集合中的数组,并在数组中存在对象时投影值"true“。如果该对象不存在于数组中,则项目"false“。我在MongoDB工作,我对它不太熟悉。

在我的场景中,我有两个正在使用的集合。我正在聚合一组‘员工’成员,我正在执行一个$lookup功能到一个‘业务’集合。在“业务”中,我拥有一系列业务功能。

例如,我收集了工作人员

代码语言:javascript
复制
staff = [
  ...
  {_id: 1, businessId: 11},
  {_id: 2, businessId: 22},
  ....
]

企业征集

代码语言:javascript
复制
businesses = [
  ...
  {_id: 11, capabilities: ["claiming", "pushing"]},
  {_id: 22, capabilities: ["claiming", "popping"]},
  ....
]

并设置如下所示的$lookup

代码语言:javascript
复制
db.getCollection('staff').aggregate([
    {
        $lookup:
            {
                from: "businesses",
                localField: "businessId",
                foreignField: "_id",
                as: "business_Info"
            }
    },

如果“$project”出现在“功能”中,那么我如何才能使每个工作人员的$canClaim: true这样的值出现呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-10 07:05:48

可以使用$in聚合运算符检查数组是否包含该值。

代码语言:javascript
复制
db.getCollection("staff").aggregate([
  { "$lookup": {
    "from": "businesses",
    "localField": "businessId",
    "foreignField": "_id",
    "as": "business_Info"
  }},
  { "$unwind": "$business_Info" },
  { "$addFields": {
    "canClaim": { "$in": ["claiming", "$business_Info.capabilities"] }
  }}
])

MongoPlayground

票数 8
EN

Stack Overflow用户

发布于 2019-05-11 06:42:02

代码语言:javascript
复制
db.getCollection("staff").aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $lookup: // Equality Match
            {
                from: "businesses",
                localField: "businessId",
                foreignField: "_id",
                as: "businessInfo"
            }

            // Uncorrelated Subqueries
            // (supported as of MongoDB 3.6)
            // {
            //    from: "<collection to join>",
            //    let: { <var_1>: <expression>, …, <var_n>: <expression> },
            //    pipeline: [ <pipeline to execute on the collection to join> ],
            //    as: "<output array field>"
            // }
        },

        // Stage 2
        {
            $project: {
                businessId: 1,
                businessInfo: {
                    $arrayElemAt: ['$businessInfo', 0]
                }
            }
        },

        // Stage 3
        {
            $addFields: {
                "businessInfo.canClaim": {
                    $cond: {
                        if: {
                            $gte: [{
                                $indexOfArray: ["$businessInfo.capabilities", 'claiming']
                            }, 0]
                        },
                        then: true,
                        else: false
                    }
                }
            }
        },

    ]



);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56072336

复制
相关文章

相似问题

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