gpt4 book ai didi

mongodb - 获取数组的第一个元素,如果数组为空,则不获取任何内容

转载 作者:可可西里 更新时间:2023-11-01 10:00:23 27 4
gpt4 key购买 nike

我有收藏:

[
{"_id": 1, "show": "Show A", "episodes": ["a", "b", "c"]},
{"_id": 2, "show": "Show B", "episodes": ["first"]},
{"_id": 3, "show": "Show C", "episodes": []}
]

我需要将它(通过聚合框架)转换为:

[
{"_id": 1, "show": "Show A", "firstEpisode": "a"},
{"_id": 2, "show": "Show B", "firstEpisode": "first"},
{"_id": 3, "show": "Show C"}
]

$slice 返回数组,但我需要值。

$unwind 去掉“show C”。

最佳答案

您只需要 $project您的文件并使用 $arrayElemAt MongoDB 3.2 中的新运算符。

db.coll.aggregate(
[
{ "$project": {
"show": 1,
"firstEpisode": { "$arrayElemAt": [ "$episodes", 0 ] }
}}
]
)

产生:

{ "_id" : 1, "show" : "Show A", "firstEpisode" : "a" }
{ "_id" : 2, "show" : "Show B", "firstEpisode" : "first" }
{ "_id" : 3, "show" : "Show C" }

现在从 MongoDB 3.0 开始,您需要一种不同的方法。

首先,如果数组为空,您需要使用逻辑$cond 为“episodes”分配一个默认值。处理和 $literal运算符。条件为$eq如果 $size 返回真数组的值为 0。

$unwind管道运算符解构“episodes”数组。

管道的最后阶段是 $group阶段,您可以按 _id 对文档进行分组并使用 $first累加器运算符返回数组中的“第一个”元素。

db.coll.aggregate(
[
{ "$project": {
"show": 1,
"episodes": {
"$cond": [
{ "$eq": [ { "$size": "$episodes" }, 0 ] },
{ "$literal": [ null ] },
"$episodes"
]
}
}},
{ "$unwind": "$episodes" },
{ "$group": {
"_id": "$_id",
"show": { "$first": "$show" },
"firstEpisode": { "$first": "$episodes" }
}}
]
)

产生:

{ "_id" : 3, "show" : "Show C", "firstEpisode" : null }
{ "_id" : 2, "show" : "Show B", "firstEpisode" : "first" }
{ "_id" : 1, "show" : "Show A", "firstEpisode" : "a" }

请注意,无法排除文档中的“episodes”字段。

关于mongodb - 获取数组的第一个元素,如果数组为空,则不获取任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37885925/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com