2012-08-06 21 views
34

En MongoDB Me gustaría encontrar un documento basado en los valores de un subdocumento que cumpla ciertos parámetros. En concreto he un documento estructurado así:MongoDB: encuentra el subdocumento en Array Matching Parameters

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

¿Cómo puedo saber MongoDB sólo para volver a mi documento si la hora de inicio de un subdocumento de datos es inferior a 5 y la hora de finalización de la misma subdocumento es mayor que 5 ? Actualmente, si lo hago

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

se volverá mi documento siempre es porque 5 es mayor que 0 y menor que 18. ¿Cómo puedo saber MongoDB sólo para volver a mi documento si 5 (o cualquier valor) es mayor que 0 y menos de 2 O mayor de 15 y menor de 18?

Respuesta

61

Quiere usar $elemMatch.

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

impresionante eso es exactamente lo que necesitaba, gracias! –

1

encontré con este post pensamiento de engañar al código que no estaba allí;) Así, el pensamiento de compartir el fragmento de código en el uso de Javaspring-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

¿puedes dar un fragmento de código como ese usando morphia? – Newton