Mongo聚合:添加从另一个字段派生的字段

Arj*_*Bal 3 mongodb aggregation-framework

我收集了以下形式的文档:

{
  name: "Michael",
  likes: [{ name: "reading", amount: 80}, {name: "eating", amount: 70}]
}
Run Code Online (Sandbox Code Playgroud)

我想向所有文档添加一个新字段,该字段将根据该人是否喜欢阅读而为 0/1。我必须检查 likes.name = "reading" 是否存在。我尝试在聚合管道中添加以下阶段来实现此目的:

$addFields: {
  likes_reading: {
    $cond: {
      if: {
        $eq: ["$likes.name", "reading"]
      },
      then: 1,
      else: 0
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然而, $eq 似乎并没有检查 likes 数组的“任何”元素是否具有所需的名称,这是我在将值与数组进行比较时在许多其他地方看到的行为。结果,所有 likes_reading 都设置为 0。我需要帮助正确设置这个新字段。

Pur*_*jax 5

由于likes是一个数组,因此您必须使用$in运算符,因此请尝试以下操作:

{
    $addFields: {
        likes_reading: {
            $cond: {
                if: { $in: ["reading", "$likes.name"] },
                then: 1,
                else: 0
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者

{
    $addFields: {
        likes_reading: {
            $cond: [{ $in: ["reading", "$likes.name"] }, 1, 0]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)