2012-08-06 13 views
34

W MongoDB Chciałbym znaleźć dokument na podstawie wartości poddokumentu spełniającego określone parametry. Konkretnie mam dokument skonstruowany tak:MongoDB: Znajdź podjednostkę w Array Matching Parameters

{ 
    name: "test", 
    data: [{ 
    name: "test1", 
    start: 0, 
    end: 2 
    }, 
    { 
    name: "test2", 
    start: 15 
    end: 18 
    }] 
} 

Jak mogę powiedzieć MongoDB tylko powrót mojego dokumentu, jeżeli czas rozpoczęcia na dokument podrzędny danych jest mniejsza niż 5, a czas zakończenia w tym samym dokument podrzędny jest większa niż 5 ? Obecnie, jeśli robię

db.foo.findOne({ 
    'data.start': { $lte: 5 }, 
    'data.end': { $gte: 5 } 
}) 

powróci mój dokument zawsze ponieważ 5 jest większe niż 0 i mniej niż 18. Jak mogę sprawdzić, MongoDB, aby tylko wrócić mojego dokumentu, jeśli 5 (lub niezależnie od wartości) jest większa niż 0 i mniej niż 2 OR większe niż 15 i mniejsze niż 18?

Odpowiedz

61

Chcesz użyć $elemMatch.

db.foo.findOne({ data: { $elemMatch : { 
    start: { $lte: 5 }, 
    end: { $gte: 5 } 
    }} 
}) 
+0

Niesamowite to jest dokładnie to, co potrzebne, dzięki! –

1

Natknąłem ten post myślenia oszustwo kod, który nie było;) Więc pomyślałem dzielenia fragment kodu w Java użyciu spring-data-mongodb

Mongo mongo = new Mongo("localhost", 27017); 
MongoTemplate mongoTemplate = new MongoTemplate(mongo, "db"); 
Query query = new Query(); 
query.addCriteria(Criteria.where("data").elemMatch(
     Criteria.where("start").lte(5) 
     .andOperator(Criteria.where("end").gte(5)))); 
Foo foo = mongoTemplate.findOne(query, Foo.class); 
+0

możesz podać fragment kodu w ten sposób używając morfiny? – Newton