gpt4 book ai didi

mongodb - Mongo 根据字段删除对象数组中的重复项

转载 作者:行者123 更新时间:2023-12-04 16:27:19 24 4
gpt4 key购买 nike

Mongo 的新手,发现了很多使用聚合框架从字符串数组中删除重复项的示例,但我想知道是否可以根据对象中的字段从对象数组中删除重复项。例如

{
"_id" : ObjectId("5e82661d164941779c2380ca"),
"name" : "something",
"values" : [
{
"id" : 1,
"val" : "x"
},
{
"id" : 1,
"val" : "x"
},
{
"id" : 2,
"val" : "y"
},
{
"id" : 1,
"val" : "xxxxxx"
}
]
}

在这里,我想根据 id 删除欺骗者 field 。所以最终会
{
"_id" : ObjectId("5e82661d164941779c2380ca"),
"name" : "something",
"values" : [
{
"id" : 1,
"val" : "x"
},
{
"id" : 2,
"val" : "y"
}
]
}

选择具有给定 id 的第一个/任何对象。只想最终每个 id 一个。这在聚合框架中可行吗?甚至在聚合框架之外,只是寻找一种干净的方法来做到这一点。需要在集合中的许多文档中执行此类操作,这似乎是聚合框架的一个很好的用例,但正如我所提到的,这里是新手...谢谢。

最佳答案

好吧,您可以通过 2 种方式获得所需的结果。
经典的
展平 - 删除重复项(选择第一个出现) - 分组依据

db.collection.aggregate([
{
$unwind: "$values"
},
{
$group: {
_id: "$values.id",
values: {
$first: "$values"
},
id: {
$first: "$_id"
},
name: {
$first: "$name"
}
}
},
{
$group: {
_id: "$id",
name: {
$first: "$name"
},
values: {
$push: "$values"
}
}
}
])
MongoPlayground
现代的
我们需要使用 $reduce运算符(operator)。
伪代码:
values : {
var tmp = [];
for (var value in values) {
if !(value.id in tmp)
tmp.push(value);
}
return tmp;
}
db.collection.aggregate([
{
$addFields: {
values: {
$reduce: {
input: "$values",
initialValue: [],
in: {
$concatArrays: [
"$$value",
{
$cond: [
{
$in: [
"$$this.id",
"$$value.id"
]
},
[],
[
"$$this"
]
]
}
]
}
}
}
}
}
])
MongoPlayground

关于mongodb - Mongo 根据字段删除对象数组中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60954387/

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