Arrays MongoDB根据所有其他元素删除元素(迭代)
如果同一个对象具有相似的元素,我希望有条件地从我的MongoDB对象中删除($reduce)元素。我的目标:Arrays MongoDB根据所有其他元素删除元素(迭代),arrays,mongodb,mongoose,mongodb-query,aggregation-framework,Arrays,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,如果同一个对象具有相似的元素,我希望有条件地从我的MongoDB对象中删除($reduce)元素。我的目标: { "_id": "5eabf8b144345b36b00bfbaa", "ranktime": [ { "pos": "15", "datum": "Mon May 01 2020 12:25:
{
"_id": "5eabf8b144345b36b00bfbaa",
"ranktime": [
{
"pos": "15",
"datum": "Mon May 01 2020 12:25:14 GMT+0200 (GMT+02:00)",
"source": "SOURCE2"
},
{
"pos": "10",
"datum": "Fri May 05 2020 12:25:14 GMT+0200 (GMT+02:00)",
"source": "SOURCE2"
},
{
"pos": "15",
"datum": "Mon May 01 2020 18:45:27 GMT+0200 (GMT+02:00)",
"source": "SOURCE2"
},
{
"pos": "20",
"datum": "Fri May 05 2020 18:45:27 GMT+0200 (GMT+02:00)",
"source": "SOURCE1"
},
{
"pos": "10",
"datum": "Fri May 05 2020 12:25:14 GMT+0200 (GMT+02:00)",
"source": "SOURCE2"
},
{
"pos": "15",
"datum": "Mon May 01 2020 18:45:27 GMT+0200 (GMT+02:00)",
"source": "SOURCE2"
}
]
}
因此,如果ranktime.source==“SOURCE2”,并且日期与之前的对象相同,我想删除ranktime中的条目。实际上,我必须遍历ranktime的单个元素。这在MongoDB中可能吗
预期结果将是:
{
"_id": "5eabf8b144345b36b00bfbaa",
"ranktime": [
{
"pos": "15",
"datum": "Mon May 01 2020 12:25:14 GMT+0200 (GMT+02:00)",
"source": "SOURCE2"
},
{
"pos": "10",
"datum": "Fri May 05 2020 12:25:14 GMT+0200 (GMT+02:00)",
"source": "SOURCE2"
},
{
"pos": "20",
"datum": "Fri May 05 2020 18:45:27 GMT+0200 (GMT+02:00)",
"source": "SOURCE1"
}
]
}
因此,根据您的示例,您希望输出
ranktime
,除非它是SOURCE2
,并且已经向输出中添加了相同的日期(但仅针对SOURCE2
)
您可以像以前一样使用$reduce
,但是您需要扫描先前添加的元素,这可以通过使用运算符实现,并且由于您的输出包含第三个元素,因此我假设重复日期是停止条件,仅当为SORUCE2
添加了相同的日期时,因此还需要准备先前添加的元素集添加了SOURCE2
s:
db.col.updateMany({}, [
{
$set: {
ranktime: {
$reduce: {
input: "$ranktime",
initialValue: [],
in: {
$cond: [
{
$and: [
{ "$eq": [ "$$this.source", "SOURCE2" ] },
{
$anyElementTrue: {
$map: {
input: { $filter: { input: "$$value", as: "prev", cond: { $eq: { "$$prev.source", "SOURCE2" } } } }, // already added SOURCE2 elements
as: "addedElement",
in: { "$eq": [ { $substr: [ "$$addedElement.datum", 0, 15 ] }, { $substr: [ "$$this.datum", 0, 15 ] } ] }
}
}
}
]
},
"$$value", // skip current element ($$this)
{ $concatArrays: [ "$$value", [ "$$this" ] ] } // add current element to the output
]
}
}
}
}
}
])
这是否回答了您的问题?重新表述您的需求:仅当其日期唯一或跳过重复的日期时才输出
SOURCE2
?正是这样!非常感谢mongodb查询大师:)