web-dev-qa-db-ja.com

mongodbの2つのフィールドの連結値に一致するレコードを選択します

MongoDBでこのようなことをする方法はありますか?

select * from table where concat(field1, field2) = 'value'

明確にするために、私はフルネームの配列を持っていますが、ドキュメントには姓と名が別々になっているので、次のようなことをしたいと思います。

select * from table where concat(firstname, lastname) in ([ARRAY OF NAMES])
13
Deleteman

通常の検索ではなく、集約フレームワークでのみ実行できます。

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"]}]}})
21
Asya Kamsky

引数($ 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を使用する場合、この結果は異なります。

5
Sridhar

マングースではあなたはそれを好きになることができます

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"
}

]

0
Ali Abbas