41

在 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。我如何告诉 MongoDB 仅在 5(或任何值)大于 0 且小于 2 或大于 15 且小于 18 时才返回我的文档?

4

2 回答 2

77

您想使用$elemMatch

db.foo.findOne({ data: { $elemMatch : {
  start: { $lte: 5 },
  end: { $gte: 5 }
  }}
})
于 2012-08-06T06:18:32.477 回答
2

看到这篇文章想欺骗不存在的代码;)所以想到在Java使用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);
于 2016-02-04T04:59:49.053 回答