gpt4 book ai didi

mongodb聚合嵌套嵌套数组

转载 作者:可可西里 更新时间:2023-11-01 10:49:50 25 4
gpt4 key购买 nike

我如何找到位置 3 上带有 $match 的文档(仅数组“ndr”中的最后一项)。只在 ndr 的最后一个数组项中进行聚合搜索是必要的。

 {
"_id" : ObjectId("58bd5c63a3d24b4a2e4cde03"),
"name" : "great document",
"country" : "us_us",
"cdate" : ISODate("2017-03-06T12:56:03.405Z"),
"nodes" : [
{
"node" : 3244343,
"name" : "Best Node ever",
"ndr" : [
{
"position" : 7,
"cdate" : ISODate("2017-03-06T10:55:20.000Z")
},
{
"position" : 3,
"cdate" : ISODate("2017-03-06T10:55:20.000Z")
}
]
}
],
}

聚合后我需要这个结果

{
"name" : "great document",
"country" : "us_us",
"cdate" : ISODate("2017-03-06T12:56:03.405Z"),
"nodes" : [
{
"node" : 3244343,
"name" : "Best Node ever",
"ndr" : [
{
"position" : 3,
"cdate" : ISODate("2017-03-06T10:55:20.000Z")
}
]
}
]
}

我希望有人能帮助我。

最佳答案

您可以尝试使用 Mongo 3.4 版本进行以下聚合。

下面的查询找到最后一项 (-1)使用 $arrayElemAt ndr 中的运算符数组并将变量存储在 last 中使用 $let每个 nodes 的运算符并比较 last变量 position使用 $$ 的值符号 3并包装 nbr数组中的元素 []如果找到条目,否则返回空数组。

$map接线员联系 nbr nodes 内的数组数组并投影更新的 nbr数组同时映射 nodes 的其余部分字段。

$addFields阶段将覆盖现有的 nodesnodes同时保留所有其他字段。

db.collection.aggregate([{
$addFields: {
nodes: {
$map: {
input: "$nodes",
as: "value",
in: {
node: "$$value.node",
name: "$$value.name",
ndr: {
$let: {
vars: {
last: {
$arrayElemAt: ["$$value.ndr", -1]
}
},
in: {
$cond: [{
$eq: ["$$last.position", 3]
},
["$$last"],
[]
]
}
}
}
}
}
}
}
}]);

更新:

你可以试试$redact如果它从给定的过滤器中找到匹配的位置,它将保留整个文档。

$map转换 true , false基于每个节点过滤器的值 nbr位置值和$anyElementTrue将检查每个文档的先前 bool 值并返回 truefalse值(value)和$redact将使用上述比较中的 booelan 值; true 值保留,false 值删除文档。

db.collection.aggregate([{
$redact: {
$cond: [{
$anyElementTrue: {
$map: {
input: "$nodes",
as: "value",
in: {
$let: {
vars: {
last: {
$arrayElemAt: ["$$value.ndr", -1]
}
},
in: {
$cond: [{
$eq: ["$$last.position", 3]
},
true,
false
]
}
}
}
}
}
}, "$$KEEP", "$$PRUNE"]
}
}]);

关于mongodb聚合嵌套嵌套数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42629516/

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