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より小さいため、常にドキュメントが返されます。5(または任意の値)が0より大きく2より小さいか、15より大きく18より小さい場合にのみ、ドキュメントを返すようにMongoDBに指示するにはどうすればよいですか。 ?

4

2 に答える 2

77

$elemMatchを使用します。

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

そこになかったコードをだますことを考えてこの投稿に出くわしました;)そこで、spring-data-mongodbJavaを使用してコードスニペットを共有することを考えました

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 に答える