2012-08-06 11 views
34

In MongoDB Vorrei trovare un documento basato sui valori di un documento secondario che soddisfa determinati parametri. In particolare ho un documento strutturato in questo modo:MongoDB: Trova documento secondario nei parametri di corrispondenza dell'array

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

Come posso dire MongoDB per restituire solo il mio documento se l'ora di inizio di un documento secondario di dati è inferiore a 5 e l'ora di fine per lo stesso documento secondario è superiore a 5 ? Attualmente, se faccio

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

verrà restituito il mio documento sempre perché 5 è maggiore di 0 e meno di 18. Come posso dire MongoDB per restituire solo il mio documento se 5 (o qualsiasi valore) è maggiore di 0 e inferiore a 2 OR maggiore di 15 e inferiore a 18?

risposta

61

Si desidera utilizzare $elemMatch.

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

impressionante che è esattamente quello che mi serviva, grazie! –

1

imbattuto in questo post il pensiero di truffa il codice che non c'era;) Così pensava di condividere il frammento di codice in Java utilizzando 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

puoi dare uno snippet di codice come quello usando la morfina? – Newton

Problemi correlati