Porównaj ceny domen i usług IT, sprzedawców z całego świata

Mongodb: zapytanie o obiekt json zagnieżdżony w tablicy


Jestem zupełnie nowy w mongodb i jest jedna rzecz, której nie mogę teraz rozwiązać:

Załóżmy, że masz następujący dokument (uproszczony):
{
'someKey': 'someValue',
'array' : [
{'name' : 'test1',
'value': 'value1'
},
{'name' : 'test2',
'value': 'value2'
}
]
}

Które żądanie zwróci obiekt json, w którym wartość to „wartość2”?
Oznacza to, że potrzebuję tego obiektu json:
{
'name' : 'test2',
'value': 'value2'
}

Oczywiście wypróbowałem już wiele możliwych zapytań, ale żadne z nich nie zwróciło na przykład tego, co chciałem
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?

Podziękować!
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


Korzystanie z operatora pozycyjnego

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

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


Korzystanie z agregacji

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

Wyjście
{ "array" : { "name" : "test2", "value" : "value2" } }


Korzystanie ze sterownika

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"}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Spróbuj użyć operatora $ in w następujący sposób:
db.test.find({"array.value" : { $in : ["value2"]}})
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz przekazać wiele obiektów wyszukiwania w elemencie dopasowania, aby uzyskać dokładną odpowiedź.
db.test.find({'array':{$elemMatch:{value:"value2"}})output: {'name' : 'test1','value': 'value1'}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Posługiwać się

$elemMatch

i kropka (.), aby uzyskać wymagane wyjście
db.getCollection('mobiledashboards').find({"_id": ObjectId("58c7da2adaa8d031ea699fff") },{ viewData: { $elemMatch : { "widgetData.widget.title" : "England" }}})

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się