2015-02-19 3 views
1

je collection avec les documents (échantillon) suivant:Trouver tous les objets, que ses propriétés imbriquées ont une valeur souhaitée

{ 
    "label": "Tree", 
    "properties": { 
     "height": { 
      "type": "int", 
      "label": "Height", 
      "description": "In meters" 
     }, 
     "coordinates": { 
      "type": "coords", 
      "label": "Coordinates" 
     }, 
     "age": { 
      "type": "int", 
      "label": "Age" 
     } 
    } 
} 

clés dans le propriétés attribut sont différentes pour presque chacun des documents dans la collection.

Je veux trouver tous les documents qui ont au moins une propriété de type donné.

Ce que je cherche est de demander ceci pour {"properties.*.type": "coords"}. Mais cela ne fonctionne pas car c'est seulement mon invention de requête mongo.

Chaque aide que j'ai pu trouver concernait l'opérateur $elemMatch que je ne peux pas utiliser ici car propriétés est un objet, pas un tableau.

+0

Avez-vous d'autres propriétés avec le type '" coords "' autre que la propriété '" properties.coordinates "'? – chridam

+0

Oui. Ceci est seulement un exemple. – fracz

Répondre

1

Salut selon mes connaissances dans mongodb ne fournit pas ce type de recherche. Donc, pour trouver ce premier je sépare toutes les clés en utilisant la carte-réduire puis trouver sous forme de requête est en bas du code vous aidera

var mapReduce = db.runCommand({ 
    "mapreduce": "collectionName", 
    "map": function() { 
    for (var key in this.properties) { 
     emit(key, null); 
    } 
    }, 
    "reduce": function(key, stuff) { 
    return null; 
    }, 
    "out": "collectionName" + "_keys" 
}) 

db[mapReduce.result].distinct("_id").forEach(function(data) { 
    findkey = []; 

    findkey.push("properties." + data + ".type"); 
    var query = {}; 
    query[findkey] = "coords"; 

    var myCursor = db.collectionName.find(query); 

    while (myCursor.hasNext()) { 
    print(tojson(myCursor.next())); 
    } 


}) 
1

MongoDB ne supporte pas les recherches sur les clés - des choses comme properties.* pour correspondre à tous les sous-clés de properties Vous ne devriez pas avoir de clés ou de clés arbitraires que vous ne connaissez pas dans votre schéma, à moins qu'elles ne soient simplement affichées, car vous ne pourrez pas très facilement interagir avec elles dans MongoDB.

Si vous souhaitez stocker des attributs dynamiques, la meilleure approche est généralement un tableau comme ce qui suit:

{ 
    "properties" : [ 
     { 
      "key" : "height", 
      "value" : { 
       "type" : "Int", 
       "label" : "Height", 
       "description" : "In meters" 
      } 
     }, 
     ... 
    ] 
} 

interrogation efficace pour votre cas d'utilisation

trouver tous les documents qui ont au moins une propriété de type donné

résulte d'un index sur { "key" : 1 }:

db.test.find({ "properties.key" : { "$in" : ["height", "coordinates", "age"] } })