在 mongodb 项目聚合中有条件地包含一个字段(_id 或其他)?
Conditionally include a field (_id or other) in mongodb project aggregation?
我有一个带有 $project 阶段的 mongodb 聚合管道,我想仅在满足条件时包含某些字段。具体来说,我想在一个条件下排除 _id 并在另一个条件下包含第二个字段 'second_id'。
我知道(还)不可能从 mongodb $项目中排除字段,但是否可以有条件地包含它们?
有没有办法有条件地排除_id字段?它接受 0 或 1,但如果我想根据 if 语句确定 0 或 1 怎么办?这将如何完成?
_id 的伪代码:
$project: { _id: { $ifNull: [ "$user_id", 0 ] } }
这个的主要用途是使用 doc.user_id 作为结果 _id,或者如果 user_id 为空,则允许 mongodb 创建一个新的自动增量 _id。
目前没有办法在 $project 阶段执行此操作,但您可以使用 $redact 阶段有条件地删除该字段(即,您将值设置为 0,就像您在示例中所做的那样。
db.collection.aggregate(
... matching and stuff ...
{$project: { _id: { $ifNull: [ "$user_id", 0 ] } }},
{$redact: {
{$cond: {
if: { $eq: [ "$user_id", 0 ] },
then: '$$PRUNE',
else: '$$DESCEND'
}}
}
我有一个技巧:
"_id": {"$cond": [{"$eq": ["$user_id", null]}, "$nonExistinField", "$user_id"]}
也许问这个问题的时候这是不可行的,但现在可以了。
有一种方法可以在 $project
阶段有条件地 include/exclude 特定字段。
这可以使用 $cond
来评估您的状况,然后 return '$true'
或 '$false'
{
myConditionalField:{$cond:{
if:{
$eq:['$some_field','some_value']
},
then:'$false',
else:'$true'
}}
}
此处,仅当上一阶段的 some_field
的值与 some_value
.
匹配时,才会投影字段 myConditionalField
注意: 这里假设 myConditionalField
已经存在于前一阶段。如果没有,那么 else
应该是 $some_field
或任何你想要投影的字段。
我有一个带有 $project 阶段的 mongodb 聚合管道,我想仅在满足条件时包含某些字段。具体来说,我想在一个条件下排除 _id 并在另一个条件下包含第二个字段 'second_id'。
我知道(还)不可能从 mongodb $项目中排除字段,但是否可以有条件地包含它们?
有没有办法有条件地排除_id字段?它接受 0 或 1,但如果我想根据 if 语句确定 0 或 1 怎么办?这将如何完成?
_id 的伪代码:
$project: { _id: { $ifNull: [ "$user_id", 0 ] } }
这个的主要用途是使用 doc.user_id 作为结果 _id,或者如果 user_id 为空,则允许 mongodb 创建一个新的自动增量 _id。
目前没有办法在 $project 阶段执行此操作,但您可以使用 $redact 阶段有条件地删除该字段(即,您将值设置为 0,就像您在示例中所做的那样。
db.collection.aggregate(
... matching and stuff ...
{$project: { _id: { $ifNull: [ "$user_id", 0 ] } }},
{$redact: {
{$cond: {
if: { $eq: [ "$user_id", 0 ] },
then: '$$PRUNE',
else: '$$DESCEND'
}}
}
我有一个技巧:
"_id": {"$cond": [{"$eq": ["$user_id", null]}, "$nonExistinField", "$user_id"]}
也许问这个问题的时候这是不可行的,但现在可以了。
有一种方法可以在 $project
阶段有条件地 include/exclude 特定字段。
这可以使用 $cond
来评估您的状况,然后 return '$true'
或 '$false'
{
myConditionalField:{$cond:{
if:{
$eq:['$some_field','some_value']
},
then:'$false',
else:'$true'
}}
}
此处,仅当上一阶段的 some_field
的值与 some_value
.
myConditionalField
注意: 这里假设 myConditionalField
已经存在于前一阶段。如果没有,那么 else
应该是 $some_field
或任何你想要投影的字段。