2012-06-05 7 views
2

Je voudrais interroger tous les objets qui ont un champ contenant une valeur spécifique. Par exemple, j'ai deux documents:requête mongodb sans nom de champ

{"123": "apple", "217": "pear", "179": "orange"} 
{"831": "pear", "189": "grapes"} 

et je voudrais obtenir tous les objets qui a un champ dont la valeur est « pomme », mais je ne connais pas le nom du champ. Est-il possible de spécifier une requête dans MongoDB pour y parvenir? (Les clés numériques dans les objets sont des identifiants enfants, et les valeurs dans les objets sont des GUID longs)

Répondre

5

Malheureusement, MongoDB ne prend en charge aucune méthode d'interrogation de tous les champs avec une valeur particulière. Il existe un ticket Jira demandant cette amélioration: https://jira.mongodb.org/browse/SERVER-1248. N'hésitez pas à commenter, voter ou suivre ce billet.

En attendant, la façon habituelle de gérer cela est de changer le schéma MongoDB. Pour votre exemple, vous modifier votre schéma existant:

{"123": "apple", "217": "pear", "179": "orange"} 
{"831": "pear", "189": "grapes"} 

Et vous pourriez structurer quelque chose comme ceci:

{ tags: [ 
     { cid: "123", value: "apple" }, 
     { cid: "217", value: "pear" }, 
     { cid: "179", value: "orange" }, 
     ] 
    } 
    { tags: [ 
     { cid: "831", value: "pear" }, 
     { cid: "189", value: "grapes" }, 
     ] 
    } 

Une fois que vous avez fait cela, vous pouvez effectuer la requête follwing pour trouver tous les des documents souhaités:

db.docs.find({'tags.value': "apple" }) 

Notez que ce schéma vous permet d'indexer les champs « tags.cid » et « tags.value », que votre schéma d'origine ne fonctionne pas.

J'espère que cela aide.

-William

0

Vous pouvez utiliser l'index de texte sur tous les champs.

use dbname 
db.collectionname.ensureIndex(
          { "$**": "text" }, 
          { name: "TextIndex" } 
         ) 

Recherche Ensuite, en utilisant:

DB db = mongoClient.getDB("dbname"); 
DBCollection coll = db.getCollection("collectionname"); 
BasicDBObject query = new BasicDBObject(); 
      query.append("$text", new BasicDBObject("$search", searchstring)); 
      DBCursor cursor = coll.find(query); 
Questions connexes