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は、以前に追加されたSOURCE2sのセットを準備するためにも必要です。

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
                        ]
                    }
                }
            }
        }
    }
])

モンゴ遊び場