Arrays MongoDB根据所有其他元素删除元素(迭代)

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:

如果同一个对象具有相似的元素,我希望有条件地从我的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)",
        "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查询大师:)