首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在mongodb聚合过程中有条件地设计字段

如何在mongodb聚合过程中有条件地设计字段
EN

Stack Overflow用户
提问于 2016-11-30 22:55:23
回答 1查看 15.5K关注 0票数 7

我有一个用户文档,如:

代码语言:javascript
复制
{
    _id: "s0m3Id",
    _skills: ["skill1", "skill2"],
}

现在,我想通过_skills字段解压这个文档,并为每个技能添加一个分数。所以我的总结看起来是:

代码语言:javascript
复制
{ 
  '$unwind': {'path': '$_skills', 'preserveNullAndEmptyArrays': true},
},
{
  '$project': {
    '_skills':
      'label': '$_skills',
      'skill_score': 1
    },
  }
},

有时_skills字段可以是空的,但是在这种情况下,我仍然希望用户文档通过聚合--因此是preserveNullAndEmptyArrays参数。但是,我遇到的问题是,它将把一个skill_score (虽然没有label)投影到有空_skills数组字段的文档上。因此,当我稍后进入$group文档时,这些文档现在有一个非空的_skills数组,其中包含一个对象,即{skill_score: 1}。这不是我想要的--我希望那些有空(或不存在) _skills字段的文档没有任何skill_score投影到它们上。

那么,我如何根据另一个字段的存在有条件地投影一个字段呢?使用$exists没有帮助,因为这是为了查询,而不是布尔表达式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-01 06:25:16

更新的

如果skill_score不存在,则此聚合将将_skills的值设置为0,然后使用$redact删除具有skill_score等于0的子文档。

代码语言:javascript
复制
db.project_if.aggregate([
  {
    $unwind: {
      path: '$_skills',
      preserveNullAndEmptyArrays: true,
    }
  },
  {
    $project: {
      _skills: {
        label: '$_skills',
        skill_score: {
          $cond: {
            if: {
              $eq: ['$_skills', undefined]
            },
            then: 0,
            else: 1,
          }
        }
      }
    }
  }, 
  {
    $redact: {
      $cond: {
        if: { $eq: [ "$skill_score", 0 ] },
        then: '$$PRUNE',
        else: '$$DESCEND'
      }
    }
  }
]);

结果如下:

代码语言:javascript
复制
[
  { "_id" : '', "_skills" : { "label" : "skill1", "skill_score" : 1 } },
  { "_id" : '', "_skills" : { "label" : "skill2", "skill_score" : 1 } },
  { "_id" : '' },
]
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40899777

复制
相关文章

相似问题

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