我有收藏:
as.numeric(gsub("^.*- ([0-9]+).*$", "\\1", cpu))
我需要将它(通过聚合框架)转换为:
[
{"_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
将“显示C”丢弃。
答案 0 :(得分:2)
使用$arrayElemAt
Array运算符返回指定数组索引处的元素:
db.collectionName.aggregate([
{ $project: { show: 1, firstEpisode: {$arrayElemAt: ["$episodes", 0] } } }
])
由于索引超出数组范围,$arrayElemAt
不会返回任何结果,因此显示C
不会有firstEpisode
。
答案 1 :(得分:2)
您只需要$project
您的文档并使用MongoDB 3.2中的$arrayElemAt
运算符new。
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
ition处理和$literal
运算符为“episodes”分配默认值。条件为{ {3}}如果数组的$eq
为0,则返回true。
$size管道运算符解构“episodes”数组。
管道中的最后一个阶段是$unwind
阶段,您的文档按_id
分组,并使用$group
累加器运算符返回数组中的“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" }
请注意,无法排除文档中的“剧集”字段。