集計パイプラインを使用して、リスト内の任意の文字列で始まる文字列を持つフィールドを持つドキュメントを確認するにはどうすればよいですか?

スティーブ・ストーク

私はmongoサーバーバージョン3.4を使用しているので、私の質問はそのバージョンの機能に関するものです。すぐにアップグレードすることはできませんので、ご注意ください。MongoDBコレクションの一部のドキュメントに、文字列を含む可能性があるが末尾の文字も含まれるフィールドがある場合、同じクエリで評価される複数の「startsWith」文字列を送信するときにそれらを見つけるにはどうすればよいですか?これを説明するのは難しいかもしれないので、いくつか例を示しましょう。すべてのドキュメントに「説明」というフィールドがあるとします。この説明は、テキストが完全に単純ではないようにエンコードされている場合があります。いくつかの値は次のようになります。

green:A-4_ABC
yellow:C-12_456
red:A-431_ZXCVQ
yellow_green:C-12_999
brown:B-3_R
gray:EN-44_195

編集:キーに単語を使用するのを間違えたと思います。キーは、数字、文字、アンダースコアのランダムな文字列、コロン、1〜3文字、ダッシュ、2つの数字、アンダースコア、最後にいくつかの英数字です。

LKEF543SLI54EH2J897FQ_HF234EWOH:ZX-82_FR2

これは恣意的で愚かなことのように聞こえますが、一意のキーを生成することを目的とした情報のエンコードです。受け取ったデータにあるので、残念ながら変更できません。

ここで、次の値のいずれかで始まる説明を含むすべてのドキュメントを検索します。これらの値はすべて、同じクエリで送信する必要があります。何百もの値が送信されている可能性があり、一致するすべてのドキュメントを一度に取得する必要があります。単一のクエリで送信される可能性のあるものの短いリストを次に示します。

green:A-4
red:A-431
gray:EN-44
yellow_green:C-12

テキストが最後の前のすべてであることは偶然ではなかったことに注意してくださいアンダースコア。また、例の1つと同様に、複数のアンダースコアが存在する場合があります。私のユースケースでは、これらの文字列をjavascript正規表現形式でハードコードするクエリを作成できません。また、$ inフィルターは、特に文字列のリストを渡す場合、「startsWith」機能では機能しません(ただし、ハードコードされたjavascript正規表現のリストを提供することはよく知っています)。このようなクエリを実行したいユーザーから渡された文字列のリストを取得できる$ in演算子を使用する方法はありますか?それとも同等のものはありますか?これらすべての一番上にあるチェリーは、一致するドキュメントを、一致する文字列で投影する方法を見つけることです(クエリから、または私が理解できないように見える部分文字列の魔法によって)。

編集:具体的には、各ドキュメントを見つけたら、キーから最後のアンダースコアまで、次のようにすべてを投影できるようにしたいです。

LKEF543SLI54EH2J897FQ_HF234EWOH:ZX-82

(その価値とともに)

正しい方向への微調整を事前に感謝します。

バリジョン

配列$objectToArrayを取得するために使用します{k:field_name, v:field_value}次に、_すべての値をトークンで分割し$arrayToObject演算子を使用してオブジェクトに変換します

次のステップでは、$match演算子を適用してドキュメントをフィルタリングし、で除外data$unsetます。

注:ドキュメントに配列またはサブドキュメントが含まれている場合は、$filter変換する前に使用することがあります$objectToArray

db.collection.aggregate([
  {
    $addFields: {
      data: {
        $arrayToObject: {
          $map: {
            input: {
              $objectToArray: "$$ROOT"
            },
            in: {
              k: "$$this.k",
              v: {
                $arrayElemAt: [
                  {
                    $split: [
                      {
                        $toString: "$$this.v"
                      },
                      "_"
                    ]
                  },
                  0
                ]
              }
            }
          }
        }
      }
    }
  },
  {
    $match: {
      "data.green": "A-4",
      "data.red": "A-431",
      "data.gray": "EN-44",
      "data.yellow_green": "C-12"
    }
  },
  {
    $unset: "data"
  }
])

MongoPlayground

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ