在MongoDB中,我想根据满足某些参数的子文档的值找到一个文档。具体来说,我的文档结构如下:
{
name: "test",
data: [{
name: "test1",
start: 0,
end: 2
},
{
name: "test2",
start: 15
end: 18
}]
}
如果数据子文档的开始时间小于5且同一子文档的结束时间大于5,我怎么能告诉MongoDB只返回我的文档?目前,如果我这样做
db.foo.findOne({
'data.start': { $lte: 5 },
'data.end': { $gte: 5 }
})
它将返回我的文档,因为5大于0且小于18.如果5(或任何值)大于0且小于2或大于15,我怎么能告诉MongoDB只返回我的文档不到18?
答案 0 :(得分:70)
您想使用$elemMatch。
db.foo.findOne({ data: { $elemMatch : {
start: { $lte: 5 },
end: { $gte: 5 }
}}
})
答案 1 :(得分:1)
这篇文章想到了欺骗那些不存在的代码;所以考虑使用spring-data-mongodb
分享Java
中的代码段
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);