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" ] ] }
]
}
}
}
}
}
}
}
])
집계 예