2017-05-30 56 views

回答

4

您可以使用$where條款的JavaScript的評價無論在任意深度做到這一點:

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和只看着你可以做到這一點的文檔「頂」級與.aggregate()$objectToArray

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

這是因爲需要$objectToArray「對象」和轉換成對象的數組連鍵"k""v"用於提供對象的每個「鍵」和「值」。我們可以使用$$ROOT來完成整個文檔。所以我們基本上把「鑰匙」變成可以搜索的「數據」。

隨着數據轉換,您可以使用簡單的「點符號」和一個常規的$regex查詢表達式來匹配「鍵」的值。

因此,聚合方法最適合「平面」文檔或處理「已知深度」,並且JavaScript方法最適合將關鍵點嵌套到任何級別。


歸屬爲:How to find MongoDB field name at arbitrary depth爲JavaScript版本搜索的基本部分。僅針對正則表達式進行了修改。