如何解决MongoDB根据所有其他元素删除元素迭代
如果同一对象具有相似的元素,我想有条件地从我的MongoDB对象中删除($ reduce)元素。我的对象:
{
"_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)",{
"pos": "15","datum": "Mon May 01 2020 18:45:27 GMT+0200 (GMT+02:00)",{
"pos": "20","datum": "Fri May 05 2020 18:45:27 GMT+0200 (GMT+02:00)","source": "SOURCE1"
},"source": "SOURCE2"
}
]
}
因此,如果ranktime.source ==“ SOURCE2”,并且日期与之前的对象相同,那么我想在ranktime中删除该条目。实际上,我必须遍历ranktime的单个元素。在MongoDB中有可能吗?
预期结果将是:
{
"_id": "5eabf8b144345b36b00bfbaa","source": "SOURCE1"
}
]
}
解决方法
因此,根据您的示例,您要输出ranktime
,除非是SOURCE2
,并且已将相同的日期添加到了输出(但仅适用于SOURCE2
)。
您可以像以前一样使用$reduce
,但是您需要扫描可以使用$anyElementTrue运算符实现的预先添加的元素,并且由于您的输出包含第三个元素,因此我假设重复的日期是停止仅在为SORUCE2
添加了相同日期的情况下才为条件,因此还需要$filter来准备一组预先添加的SOURCE2
:
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",15 ] },{ $substr: [ "$$this.datum",15 ] } ] }
}
}
}
]
},"$$value",// skip current element ($$this)
{ $concatArrays: [ "$$value",[ "$$this" ] ] } // add current element to the output
]
}
}
}
}
}
])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。