【问题标题】:$add with some fields as Null returning sum value as Null$add 将某些字段作为 Null 返回总和值为 Null
【发布时间】:2016-02-07 15:20:04
【问题描述】:

这些是我收藏的文档

{ "_id" : 1, "quizzes" : [ 10, 6, 7 ], "labs" : [ 5, 8 ], "final" : 80, "midterm" : 75 ,"extraMarks":10}
{ "_id" : 2, "quizzes" : [ 9, 10 ], "labs" : [ 8, 8 ], "final" : 95, "midterm" : 80 }
{ "_id" : 3, "quizzes" : [ 4, 5, 5 ], "labs" : [ 6, 5 ], "final" : 78, "midterm" : 70 }

只有文档 1 有一个字段额外标记:

现在我必须将投影作为“final”+“midterm”+“extraMarks”的总和

我写了一个投影查询如下:

db.students.aggregate([    {      $project: {          examTotal: { $add: [ "$final", "$midterm","$extraMarks" ] }      }    } ])

此查询为 Document1 以及 Doc2 和 Doc3 提供了正确的结果,因为该字段不存在,其给出的总和为 null。

是否可以检查该字段是否不为空并添加查询本身..对此有什么建议吗?

Mongo DB 查询中是否有类似于 nvl(在 SQL 中)的功能?

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    你可以做两个投影,第一个使用$ifNull,类似于nvl:

    db.students.aggregate([
      { $project: { final: 1, midterm: 1, extraMarks: { $ifNull: [ "$extraMarks", 0 ] } } }, 
      { $project: { examTotal: { $add: [ "$final", "$midterm","$extraMarks" ] } } } 
    ])
    

    【讨论】:

    • 您可以将管道缩短到一个阶段:{ "$project": { "final": 1, "midterm": 1, "examTotal": { "$add": [ "$final", "$midterm", { "$ifNull": [ "$extraMarks", 0 ] } ] } } }
    • @user3100115..谢谢,这非常有帮助,因为我在 java 端进行了整个处理,单投影非常有用...
    • @user3100115...是否可以只获取前两条记录..而忽略上述查询中的第三条记录?
    【解决方案2】:

    使用$match 阶段,将其添加到管道的开头 {$match: {"your_field":{$exists: true}}}

    【讨论】:

    • 谢谢@Dummy..这是查询吗?
    • db.students.aggregate([ {$match: {"extraMarks":{$exists: true}}}, { $project: { ExamTotal: { $add: [ "$final", "$midterm","$extraMarks" ] } } } ]?
    • 如果您的管道看起来像匹配阶段的那样,匹配阶段将过滤掉任何没有字段“extraMarks”的文档,我在回答中的意思是,您可以指定一个匹配阶段,例如我确实选择了必须包含提到的字段的文档,任何没有提到的字段的文档都将被“丢弃”
    • 但我希望结果如下: doc1: sum==165(80+75+10) doc2: sum=175,doc3 : sum =148
    • 它是聚合框架中的匹配阶段,它接受你通常传递给find ()方法的表达式。并且您还想在匹配阶段表达式中添加其他字段
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    相关资源
    最近更新 更多