MongoDB 查询 - $condition by 数组中的元素

MongoDB queries - $condition by element in array

我有以下由单个 $redact 步骤组成的聚合管道: (应该 return 记录的销售数量超过库存的所有产品)

$redact:
{
  $cond: [
    { $gt: ["$sales", "$productInfo.0.stock"] },
    "$$KEEP",
    "$$PRUNE"
  ]
}

(上面的语法是 Compass 特有的,所以这里没有问题)

实体看起来像:

{
   _id: 123,
   sales: 60,
   price: 80,
   productInfo: [
      {
         stock: 100
      }
   ]
}

但是,上面的查询似乎不起作用。我的推测是问题是由与 $productInfo.0.stock 的比较引起的,因为将其替换为实体的另一个直接属性(例如 price)运行没有任何问题。

如何指定这样的查询($cond by $gt,其中一个值来自 array/list)?

productionInfo.0.stock 语法是 Mongo 查询语言 (MQL),可用于 $matchfind

使用聚合语法时,该特定构造不可用,例如 "$fieldName"。相反,您需要使用 $arrayElemAt,但不幸的是,它不支持访问引用元素中的字段。

要得到你想要的,你需要在前面阶段添加一个字段,从数组中检索所需的元素,在 $redact 中引用该对象,然后投影出临时字段,例如:

{$addFields: {firstProduct: {$arrayElemAt: [ "$productInfo", 0 ]}}},
{$redact:{
  $cond: [
    { $gt: ["$sales", "$productInfo.0.stock"] },
    "$$KEEP",
    "$$PRUNE"
  ]
}},
{$project: {firstProduct: 0}}