【问题标题】:MongoDB queries - $condition by element in arrayMongoDB 查询 - 数组中的元素 $condition
【发布时间】:2021-07-30 12:32:01
【问题描述】:

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

$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 其中一个值来自数组/列表)?

【问题讨论】:

  • 你能分享一个存储在集合中的文档示例和所需的输出吗?

标签: mongodb mongodb-query aggregation-framework spring-data-mongodb


【解决方案1】:

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}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多