MongoDB는 이전 요소에 따라 요소를 제거합니다 (반복).

Aug 19 2020

동일한 개체에 유사한 요소가있는 경우 조건이있는 MongoDB 개체에서 ($ unset) 요소를 제거하고 싶습니다. 내 개체 :

{
   "_id": "5eabf8b144345b36b00bfbaa",
   "ranktime": [{
      "pos":"2",
      "datum":"Mon May 05 2020 12:22:52 GMT+0200 (GMT+02:00)",
      "source":"SOURCE2"
    },{
      "pos":"1",
      "datum":"Fri May 01 2020 12:23:10 GMT+0200 (GMT+02:00)",
      "source":"SOURCE1"
    },{
      "pos":"37",
      "datum":"Fri May 01 2020 12:25:14 GMT+0200 (GMT+02:00)",
      "source":"SOURCE2"
    },{
      "pos":"12",
      "datum":"Fri May 01 2020 12:25:14 GMT+0200 (GMT+02:00)",
      "source":"SOURCE2"
    },{
      "pos":"37",
      "datum":"Fri May 01 2020 18:45:27 GMT+0200 (GMT+02:00)",
      "source":"SOURCE2"
    }]
}

나는의 항목 제거 할 수 있도록 ranktime하는 경우 ranktime.source == "SOURCE2"날짜 전에 객체와 동일하고있는 경우입니다. 실제로 나는의 단일 요소를 반복해야합니다 ranktime. MongoDB에서 이것이 가능합니까?

예상 결과는 다음과 같습니다.

{
   "_id": "5eabf8b144345b36b00bfbaa",
   "ranktime": [{
      "pos":"2",
      "datum":"Mon May 05 2020 12:22:52 GMT+0200 (GMT+02:00)",
      "source":"SOURCE2"
    },{
      "pos":"1",
      "datum":"Fri May 01 2020 12:23:10 GMT+0200 (GMT+02:00)",
      "source":"SOURCE1"
    },{
      "pos":"37",
      "datum":"Fri May 01 2020 12:25:14 GMT+0200 (GMT+02:00)",
      "source":"SOURCE2"
    }]
}

답변

1 mickl Aug 19 2020 at 08:38

기본적으로 $ reduce 를 사용 하여 배열을 처리하고 $ let 및 $ arrayElemAt 문을 사용하여 이전 요소를 정의 할 수 있습니다 . 새로운 $ set 구문을 사용하면 update 문 내에서 집계를 사용할 수 있습니다.

db.col.updateMany({}, [
    {
        $set: { ranktime: { $reduce: {
                    input: "$ranktime", initialValue: [], in: { $let: {
                            vars: { last: { $arrayElemAt: [ "$$value", -1 ] } },
                            in: {
                                $cond: [ { $and: [ 
                                            { "$eq": [ "$$last.source", "SOURCE2" ] },
                                            { "$eq": [ { $substr: [ "$$last.datum", 0, 15 ] }, { $substr: [ "$$this.datum", 0, 15 ] } ] }, ] }, "$$value",
                                    { $concatArrays: [ "$$value", [ "$$this" ] ] }
                                ]
                            }
                        }
                    }
                }
            }
        }
    }
])

집계 예