2014-06-18 13 views
6

Sono abbastanza nuovo per MongoDB e c'è una cosa che non riesco a risolvere in questo momento:
Facciamo finta, è stato il seguente documento (semplificato):MongoDB: Interrogazione di un oggetto JSON-annidato in un array

{ 
    'someKey': 'someValue', 
    'array' : [ 
     {'name' : 'test1', 
     'value': 'value1' 
     }, 
     {'name' : 'test2', 
     'value': 'value2' 
     } 
    ] 
} 

Quale query restituirebbe l'oggetto json, in cui il valore equivale a "valore2"?

Ciò significa, ho bisogno di questo JSON-oggetto:

{ 
    'name' : 'test2', 
    'value': 'value2' 
} 

Naturalmente ho già provato un sacco di possibili interrogazioni, ma nessuno di loro ha restituito il diritto, per esempio

db.test.find({'array.value':'value2'}) 
db.test.find({'array.value':'value2'}, {'array.value':1}) 
db.test.find({'array.value':'value2'}, {'array.value':'value2'}) 

Qualcuno può aiutarmi e mostrarmi, cosa sto facendo male?
Grazie!

risposta

12

Utilizzando operatore posizionale

db.test.find(
    { "array.value": "value2" }, 
    { "array.$": 1, _id : 0 } 
) 

uscita

{ "array" : [ { "name" : "test2", "value" : "value2" } ] } 

Utilizzando aggregazione

db.test.aggregate([ 
    { $unwind : "$array"}, 
    { $match : {"array.value" : "value2"}}, 
    { $project : { _id : 0, array : 1}} 
]) 

uscita

{ "array" : { "name" : "test2", "value" : "value2" } } 

Uso del driver Java

MongoClient mongoClient = new MongoClient(new ServerAddress("localhost", 27017)); 
    DB db = mongoClient.getDB("mydb"); 
    DBCollection collection = db.getCollection("test"); 

    DBObject unwind = new BasicDBObject("$unwind", "$array"); 
    DBObject match = new BasicDBObject("$match", new BasicDBObject(
      "array.value", "value2")); 
    DBObject project = new BasicDBObject("$project", new BasicDBObject(
      "_id", 0).append("array", 1)); 

    List<DBObject> pipeline = Arrays.asList(unwind, match, project); 
    AggregationOutput output = collection.aggregate(pipeline); 

    Iterable<DBObject> results = output.results(); 

    for (DBObject result : results) { 
     System.out.println(result.get("array")); 
    } 

uscita

{ "name" : "test2" , "value" : "value2"} 
1

Prova il $ operatore in questo modo:

db.test.find({"array.value" : { $in : ["value2"]}})

+0

Grazie per il vostro aiuto, ma purtroppo non funziona neanche. Se lo eseguo nel terminale, restituisce l'intero documento –

0

Usa $ elemMatch e punto (.) Per ottenere l'uscita richiesta

db.getCollection('mobiledashboards').find({"_id": ObjectId("58c7da2adaa8d031ea699fff") },{ viewData: { $elemMatch : { "widgetData.widget.title" : "England" }}}) 
0

È possibile passare più oggetti vicini a partita elemento per ottenere la risposta esatta.

db.test.find({'array':{$elemMatch:{value:"value2"}}) 

output: {'name' : 'test1','value': 'value1'} 
Problemi correlati