【问题标题】:Unwind empty array in mongodb在 mongodb 中展开空数组
【发布时间】:2014-04-02 14:40:23
【问题描述】:

这与this question 非常相似,但是,当使用类似的方法时,我不断得到一个仅包含子文档的文档列表。

我有一个简单的模式,其中的问题可以投票赞成和反对。我的架构(为简单起见,我删除了一些字段):

var mongoose = require('mongoose');

var voteSchema = new mongoose.Schema({
  value: Number,
});

// Document schema for polls
exports.PollSchema = new mongoose.Schema({
    question: { type: String, required: true },
    votes: [voteSchema],
});

我想要一个包含所有问题及其各自分数的列表。分数是 voteSchema 中“值”字段的总和。

我正在尝试使用 $cond 来确保将空投票文档替换为至少一个值为 0 的投票子文档。不幸的是,使用它时,我所有的 totalScore 字段都是 0。如果不使用它,我得到了正确的 totalScore,但仅适用于非空的。

Poll.aggregate([
    { $project: {
        _id: 1,
        question: 1,
        totalScore : 1,
        votes : { $cond : [ { $eq : ["$votes.length", 0]}, '$votes', [ { value : 0} ]] }
    }},
    { $unwind: "$votes" },
    { $group: {
        _id : "$_id",
        question: { $first: "$question" },
        totalScore : { $sum: "$votes.value" }
    }},
], function(error, polls) {
    console.dir(polls);
});

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    如果你的空votesnull(不存在),尝试使用:

    { $ifNull : [ "$votes", [ { value : 0 } ] ] }  
    

    代替:

    { $cond : [ { $eq : [ "$votes.length", 0 ] }, '$votes', [ { value : 0 } ] ] }  
    

    如果你的空votes[](空数组):

    { $cond : [ { $eq : [ "$votes", [] ] }, [ { value : 0 } ], '$votes' ] }  
    

    还有一些关于$cond操作员:

    它的语法{ $cond: [ <boolean-expression>, <true-case>, <false-case> ] }

    但是你用过,比如:{ $cond: [ <boolean-expression>, <false-case>, <true-case> ] }

    如果votes不存在或空数组(布尔条件为true)你应该使用[ { value : 0} ]而不是它(粘贴[ { value : 0} ]2$cond 运算符数组)。
    此外,在这种情况下,length 属性不可访问。

    【讨论】:

    • 愚蠢的我。非常感谢。这成功了: votes : { $cond : [ { $eq : ["$votes", [] ]}, [ { value : 0} ], '$votes'] }
    • 如果我需要检查数组是空还是空怎么办?
    【解决方案2】:

    如果您需要检查所有:empty arraynullempty 值,您可以这样做:

    {
      $cond: [
        {
          $in: [
            "$my_array",
            [
              null,
              undefined,
              []
            ]
          ]
        },
        "inCaseTrueValue",
        "inCaseFalseValue"
      ]
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-21
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2017-01-15
      • 2015-02-25
      • 2017-03-03
      相关资源
      最近更新 更多