2017-05-30 10 views
2

MongoDBデータベースで正規表現を使用してフィールド名を検索する方法はありますか?ドキュメントには、フィールド値を検索する$ regexフィールドが記載されています。regexでフィールド名を検索する

db.collection.find(
    function() { 
    var findKey = new RegExp("^start"); 

    function inspectObj(doc) { 
     return Object.keys(doc).some(function(key) { 
     if (typeof(doc[key]) == "object") { 
      return inspectObj(doc[key]); 
     } else { 
      return findKey.test(key); 
     } 
     }); 
    } 
    return inspectObj(this); 
    } 
) 

それとも、MongoDBの3.4持っているだけで、あなたがこれを行うことができ、文書の「トップ」レベルで探している場合:

答えて

4

あなたは$where句のJavaScriptの評価のいずれかを使用して、任意の深さでこれを行うことができます.aggregate()$objectToArray有する:

db.collection.aggregate([ 
    { "$addFields": { 
    "finder": { "$objectToArray": "$$ROOT" } 
    }}, 
    { "$match": { "finder.k": /^start/ } } 
]) 

$objectToArrayは「オブジェクト」を取り、キー"k"と持つオブジェクトの配列に変換するためであります指定されたオブジェクトの "キー"と "値"のそれぞれについて。 $$ROOTを使用してこれを文書全体に行うことができます。だから、基本的には "キー"を検索できる "データ"に変えています。

データを変換すると、単純な「ドット表記」と通常の$regexクエリ式を使用して、「キー」の値と一致させることができます。

したがって、「フラット」ドキュメントや「既知の深さ」を処理する場合は、集計方法が最も適しています。JavaScriptアプローチは、どのレベルでもキーがネストできる場合に最適です。


に帰属:検索のJavaScriptのバージョンの要部についてHow to find MongoDB field name at arbitrary depth。正規表現用にのみ変更されました。

関連する問題