2014-06-18 24 views
6

jestem zupełnie nowy na MongoDB i jest jedna rzecz, nie mogę rozwiązać teraz:
Udawajmy, dostępne są następujące dokumenty (uproszczony):MongoDB: Zapytanie o JSON obiekt zagnieżdżony w tablicy

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

Które zapytanie zwróci obiekt json, w którym wartość jest równa "wartość2"?

Oznacza to, że trzeba ten obiekt JSON:

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

Oczywiście Próbowałem już wiele możliwych pytań, ale żaden z nich wróciła prawo, na przykład

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

Czy ktoś może mi pomóc i pokazać, co robię źle?
Dzięki!

Odpowiedz

12

z pozycyjnym operatora

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

Wyjście

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

Korzystanie agregację

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

wyjście

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

Korzystanie Sterownik 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")); 
    } 

wyjście

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

Spróbuj $ w operatora takiego:

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

+0

Dzięki za pomoc, ale niestety to też nie działa. Jeśli uruchomię to w terminalu, zwróci cały dokument –

0

Zastosowanie $ elemMatch i kropka (.), Aby uzyskać wymagane wyjście

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

można przekazać wiele obiektów znalezienia w elemencie meczu na uzyskanie dokładnej odpowiedzi.

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

output: {'name' : 'test1','value': 'value1'} 
Powiązane problemy