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),可用于 $match
或 find
。
使用聚合语法时,该特定构造不可用,例如 "$fieldName"
。相反,您需要使用 $arrayElemAt
,但不幸的是,它不支持访问引用元素中的字段。
要得到你想要的,你需要在前面阶段添加一个字段,从数组中检索所需的元素,在 $redact 中引用该对象,然后投影出临时字段,例如:
{$addFields: {firstProduct: {$arrayElemAt: [ "$productInfo", 0 ]}}},
{$redact:{
$cond: [
{ $gt: ["$sales", "$productInfo.0.stock"] },
"$$KEEP",
"$$PRUNE"
]
}},
{$project: {firstProduct: 0}}
我有以下由单个 $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),可用于 $match
或 find
。
使用聚合语法时,该特定构造不可用,例如 "$fieldName"
。相反,您需要使用 $arrayElemAt
,但不幸的是,它不支持访问引用元素中的字段。
要得到你想要的,你需要在前面阶段添加一个字段,从数组中检索所需的元素,在 $redact 中引用该对象,然后投影出临时字段,例如:
{$addFields: {firstProduct: {$arrayElemAt: [ "$productInfo", 0 ]}}},
{$redact:{
$cond: [
{ $gt: ["$sales", "$productInfo.0.stock"] },
"$$KEEP",
"$$PRUNE"
]
}},
{$project: {firstProduct: 0}}