在 MongoDB 聚合中用 $cond 替换 $ifNull
Replacing $ifNull with $cond in MongoDB aggregation
我正在考虑将我的应用程序从 MongoDB 3.6 迁移到 AWS DocumentDB。我正在检查是否支持所有内容,我在代码中发现了 $ifNull
(聚合)。 DocumentDB 不支持 $ifNull
.
对于样本文档集:
[
{ "hostname": "foo", "name": "a", "is_valid": true },
{ "hostname": "foo", "name": "b", "is_valid": false },
{ "hostname": "foo", "name": "c" }
]
我想按主机名字段对文档进行分组,如果 is_valid 字段不存在,请将其设置为真。这是当前聚合查询:
{
$group: {
_id: "$hostname",
boxes: {
$push: {
name: "$name",
is_valid: { $ifNull: ["$is_valid", true]}
}
}
}
}
它returns:
{
"_id": "foo",
"boxes": [
{ "name": "a", "is_valid": true },
{ "name": "b", "is_valid": false },
{ "name": "c", "is_valid": true }
]
}
这是我试过的:
{
$group: {
_id: "$hostname",
boxes: {
$push: {
name: "$name",
is_valid: { $cond: [{$ne: ["$is_valid", null]}, "$is_valid", true]}
}
}
}
}
但是 returns:
{
"_id": "foo",
"boxes": [
{ "name": "a", "is_valid": true },
{ "name": "b", "is_valid": false },
{ "name": "c" }
]
}
如何将 $ifNull
翻译成等价的 $cond
?
将 $ne
更改为 $gt
有效。
{
$group: {
_id: "$hostname",
boxes: {
$push: {
name: "$name",
is_valid: { $cond: [{$gt: ["$is_valid", null]}, "$is_valid", true]}
}
}
}
}
如果有人知道为什么会这样,我会更好地理解它。
Amazon DocumentDB 于 2021 年 1 月添加了对 $ifNull 的支持。
我正在考虑将我的应用程序从 MongoDB 3.6 迁移到 AWS DocumentDB。我正在检查是否支持所有内容,我在代码中发现了 $ifNull
(聚合)。 DocumentDB 不支持 $ifNull
.
对于样本文档集:
[
{ "hostname": "foo", "name": "a", "is_valid": true },
{ "hostname": "foo", "name": "b", "is_valid": false },
{ "hostname": "foo", "name": "c" }
]
我想按主机名字段对文档进行分组,如果 is_valid 字段不存在,请将其设置为真。这是当前聚合查询:
{
$group: {
_id: "$hostname",
boxes: {
$push: {
name: "$name",
is_valid: { $ifNull: ["$is_valid", true]}
}
}
}
}
它returns:
{
"_id": "foo",
"boxes": [
{ "name": "a", "is_valid": true },
{ "name": "b", "is_valid": false },
{ "name": "c", "is_valid": true }
]
}
这是我试过的:
{
$group: {
_id: "$hostname",
boxes: {
$push: {
name: "$name",
is_valid: { $cond: [{$ne: ["$is_valid", null]}, "$is_valid", true]}
}
}
}
}
但是 returns:
{
"_id": "foo",
"boxes": [
{ "name": "a", "is_valid": true },
{ "name": "b", "is_valid": false },
{ "name": "c" }
]
}
如何将 $ifNull
翻译成等价的 $cond
?
将 $ne
更改为 $gt
有效。
{
$group: {
_id: "$hostname",
boxes: {
$push: {
name: "$name",
is_valid: { $cond: [{$gt: ["$is_valid", null]}, "$is_valid", true]}
}
}
}
}
如果有人知道为什么会这样,我会更好地理解它。
Amazon DocumentDB 于 2021 年 1 月添加了对 $ifNull 的支持。