MongoDBは、他のすべての要素に応じて要素を削除します(反復)
Aug 22 2020
同じオブジェクトに同様の要素がある場合、条件付きの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のエントリを削除したいと思います。実際、私はランクタイムの単一の要素を反復処理する必要があります。これは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"
}
]
}
回答
1 mickl Aug 22 2020 at 20:34
だからあなたの例をもとに、あなたは、出力したいranktime
場合を除き、それがあるSOURCE2
と、同じ日付がすでに(だけのための出力に追加されましたSOURCE2
)。
あなたは使用することができ$reduce
、以前のようにはできますが、使用して達成することができるpreviosly追加された要素をスキャンする必要があります$ anyElementTrueオペレーターをして、あなたの出力は第三の要素が含まれているので、私は繰り返し日が同じ日付が追加されました場合にのみ、停止条件であると仮定しているSORUCE2
ので、を$ filterは、以前に追加された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
]
}
}
}
}
}
])
モンゴ遊び場