MongoDBでこのようなことをする方法はありますか?
select * from table where concat(field1, field2) = 'value'
明確にするために、私はフルネームの配列を持っていますが、ドキュメントには姓と名が別々になっているので、次のようなことをしたいと思います。
select * from table where concat(firstname, lastname) in ([ARRAY OF NAMES])
通常の検索ではなく、集約フレームワークでのみ実行できます。
db.coll.aggregate({$project:{newField:{$concat:["$field1","$field2"]}}},
{$match:{newField:"value"}}
);
MongoDBでは計算値のインデックスが(まだ)サポートされていないため、これではインデックスを使用できないことに注意してください。
field1
にインデックスがあり、field1がvalue
に寄与すると予想される文字数がわかっている場合は、次のようにこの集計のパフォーマンスを向上させることができます。
db.coll.aggregate({$match:{field1:/^val/}},
{$project:{newField:{$concat:["$field1","$field2"]}}},
{$match:{newField:"value"}}
);
ここで、val
は「value」文字列の最初の部分です(ただし、field1
の可能な最短値より多くの文字を比較してはなりません。
[〜#〜] edit [〜#〜]バージョン3.6では、$expr
式を使用して検索でこれを行うことができます。
db.coll.find({$expr:{$eq:["value", {$concat:["$field1", "$field2"]}]}})
引数($ field1または$ field2)がnullの値に解決されるか、欠落しているフィールドを参照する場合、$ concatはnullを返します。 mongoDB3.0以降、引数がnullかどうかを確認し、代替を提供するために、新しい$ ifNullが提供されています。
{ $ifNull: [ <expression>, <replacement-expression-if-null> ] }
db.coll.aggregate({$project:{newField:{$concat:[{$ifNull:["$field1",""]},{$ifNull:["$field2",""]}]}}},
{$match:{newField:"value"}})
$ matchを使用している場合、結果は変わらない可能性がありますが、$ regexを使用する場合、この結果は異なります。
マングースではあなたはそれを好きになることができます
let clause = [
{$project:{name:{$concat["$first_name"," ","$last_name"]}}},
{$match:{name:new RegExp("ab", 'i')}}
];
Model.aggregate(clause)
OutPutはそのようになります
[
{
"_id": "5911db2b9235272052fdd2e1",
"name": "ALi Abbas"
},
{
"_id": "5912f7dd8bdbc24aa37b5239",
"name": "ALi Abad"
},
{
"_id": "59229e0322abdb311818e419",
"name": "Syed ALi Abbas Shah"
},
{
"_id": "592837da188fa969cc135ddc",
"name": "Abu Akbar"
}
]