私は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"
}
])
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加