gpt4 book ai didi

Mongodb 聚合一个 $slice 以从嵌套数组中获取精确位置的元素

转载 作者:可可西里 更新时间:2023-11-01 09:20:14 28 4
gpt4 key购买 nike

我想从嵌套数组中检索一个值,该值存在于数组中的确切位置。

我想通过为 name 执行 $slice[0,1] 然后为 value 执行 $slice[1,1] 来创建名称值对。

在尝试使用聚合之前,我想尝试在嵌套数组中进行查找。我可以在文档中的单个深度数组上做我想做的事情,如下所示:

{
"_id" : ObjectId("565cc5261506995581569439"),
"a" : [
4,
2,
8,
71,
21
]
}

我应用以下内容:db.getCollection('anothertest').find({},{_id:0, a: {$slice:[0,1]}})我得到:

{
"a" : [
4
]
}

这太棒了。但是,如果我想要 $slice [0,1] 的数组位于 objectRawOriginData.Reports.Rows.Rows.Cells 的文档中怎么办?

如果我首先可以找到,那么我想应用与聚合相同的内容。

最佳答案

您最好的选择是推迟到 MongoDB 3.2 进行部署,或者至少在此期间开始使用候选发布版本,尤其是在您的应用程序尚未准备好发布的情况下。主要原因是“投影”$slice 不适用于聚合框架,其他形式的数组匹配投影也不行。但这已在即将发布的版本中得到解决。

这将为您提供几个新的运算符,即 $slice甚至 $arrayElemAt可用于按聚合管道中的位置寻址数组元素。

或者:

db.getCollection('anothertest').aggregate([
{ "$project": {
"_id": 0,
"a": { "$slice": ["$a",0,1] }
}}
])

返回熟悉的:

{ "a" : [ 4 ] }

或者:

db.getCollection('anothertest').aggregate([
{ "$project": {
"_id": 0,
"a": { "$arrayElemAt": ["$a", 0] }
}}
])

这只是元素而不是数组:

{ "a" : 4 }

在发布候选版本以外的版本可用之前,当前可用的运算符使得数组的“第一个”元素变得非常容易:

db.getCollection('anothertest').aggregate([
{ "$unwind": "$a" },
{ "$group": {
"_id": "$_id",
"a": { "$first": "$a" }
}}
])

通过使用 $first $unwind 之后的运算符.但是获得另一个索引位置变得非常迭代:

db.getCollection('anothertest').aggregate([
{ "$unwind": "$a" },
// Keeps the first element
{ "$group": {
"_id": "$_id",
"first": { "$first": "$a" },
"a": { "$push": "$a" }
}},
{ "$unwind": "$a" },
// Removes the first element
{ "$redact": {
"$cond": {
"if": { "$ne": [ "$first", "$a" ] },
"then": "$$KEEP",
"else": "$$PRUNE"
}
}},
// Top is now the second element
{ "$group": {
"_id": "$_id",
"second": { "$first": "$a" }
}}
])

等等,还有很多处理来改变它以处理可能比您正在寻找的“第 n 个”元素短的数组。如此“可能”,但丑陋且性能不佳。

还注意到“不是真的”与“索引位置”一起工作,并且纯粹是在值上匹配。因此重复的值很容易被删除,除非每个数组元素有另一个唯一标识符可供使用。 Future $unwind 还具有投影数组索引的能力,这对于其他用途很方便,但其他运算符对于这种特定情况比该功能更有用。

所以为了我的钱,我会等到你有可用的功能才能将它集成到聚合管道中,或者至少重新考虑你为什么认为你需要它并可能围绕它进行设计。

关于Mongodb 聚合一个 $slice 以从嵌套数组中获取精确位置的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34009314/

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