2017-05-30 8 views

Antwort

4

Sie können dies entweder in beliebiger Tiefe mit Hilfe von JavaScript Auswertung einer $where Klausel:

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); 
    } 
) 

Oder wenn haben Sie MongoDB 3.4 und suchen nur auf der „oberen“ Ebene des Dokuments können Sie dies tun mit .aggregate() und $objectToArray:

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

Dies liegt daran, $objectToArray ein „Objekt“ führt und übersetzt in eine Anordnung von Gegenständen mit Tasten "k" und "v" für jeden "Schlüssel" und "Wert" des gelieferten Objekts. Wir können dies mit $$ROOT für das gesamte Dokument tun. Wir machen also im Grunde die "Schlüssel" zu "Daten", die durchsucht werden können.

Mit den transformierten Daten können Sie dann einfache "Punktnotation" und einen regulären Abfrageausdruck $regex verwenden, um den Wert des "Schlüssels" abzugleichen.

Also die Aggregatmethode ist am besten für "flache" Dokumente oder Umgang mit einer "bekannten Tiefe", und der JavaScript-Ansatz ist am besten, wo der Schlüssel auf jeder Ebene verschachtelt werden könnte.


Zurechnung an: How to find MongoDB field name at arbitrary depth für die wesentliche Teile der JavaScript-Version der Suche. Nur für den regulären Ausdruck geändert.