【问题标题】:MongoDb - checking existence of param in array during $addFieldsMongoDb - 在 $addFields 期间检查数组中是否存在参数
【发布时间】:2021-11-16 19:04:46
【问题描述】:

鉴于这个幻想数据集(抱歉,我无法正确格式化它):

我需要创建一个 MongoDb 管道,在其中创建一个新字段,并且当“k”参数丢失或为空时,这个新字段应该能够添加一个值为空字符串的参数。

这是我的尝试:

...    
{
    "$addFields": {
        "colors_field": {
            "r": "$colors.r",
            "g": "$colors.g",
            "b": "$colors.b",
            "k": {
                "$cond": {
                    "if": {
                       "$or": [
                            {"$eq": [ "$colors.k", "" ]},
                            {"$eq": [ "$colors.k", null ]},
                            {"$colors.k": { "$exists": false}}
                            ]
                    },
                    "then": "",
                    "else": "$colors.k"
                }
            }
        }
    }
}

我尝试使用 $exists 但我无法使其工作,因为我调用值来检查的方式:要么我输入“$colors.k”,它返回一个“MongoError: Unrecognized expression”或者我不这样做,它会返回一个“MongoError: FieldPath 字段名称可能不包含'.'”。 我也尝试检查该字段的长度,但如果该字段丢失,它会崩溃。

【问题讨论】:

  • 尝试用$ifnull 替换$cond 就像{"k" : { $ifNull: [ "$colors.k", "" ] }} 这意味着如果color.k 不存在或具有空值,取值“”,这就是你我想。
  • 看起来工作正常!我仍然无法理解它应该如何工作,如果我不说明拥有“k”的实体,它怎么知道在哪里寻找它?无论如何,如果您将其发布为答案,我会将其标记为解决方案!

标签: mongodb exists


【解决方案1】:

您的查询的问题是您使用的是查询操作$exists 在管道内(只有 $match 阶段允许这样做)。

我们在聚合中没有 "$exists" 运算符,但我们可以使用 $type 和 "missing" 来完成它,但在这里你想要存在或 null,所以 $ifnull 是正确的做法(确实如此exaclty this,name 具有误导性,如果不存在或为 null)。

查询(3 种方法)

  1. $type 和“缺失”(如果你想要的正确方法只存在),这里你想要 null,所以它也变成更大的查询
  2. $ifnull这是最短路径
  3. $cond not-exists 或 null 都是错误值,所以这也有效,但是 小心这个,因为如果颜色是假的,它也会“”

*在您的情况下,简短而安全的解决方案是 2

Test code here

db.collection.aggregate([
  {
    "$set": {
      "k-cond": {
        "$cond": [
          {
            "$or": [
              {
                "$eq": [
                  "$colors.k",
                  null
                ]
              },
              {
                "$eq": [
                  {
                    "$type": "$colors.k"
                  },
                  "missing"
                ]
              }
            ]
          },
          "",
          "$colors.k"
        ]
      },
      "k-ifnull": {
        "$ifNull": [
          "$colors.k",
          ""
        ]
      },
      "k-if": {
        "$cond": [
          "$colors.k",
          "$colors.k",
          ""
        ]
      }
    }
  }
])

【讨论】:

    猜你喜欢
    • 2016-10-22
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    相关资源
    最近更新 更多