2012-08-06 108 views
34

在MongoDB中,我想根據滿足特定參數的子文檔的值找到文檔。具體來說,我有一個文件的結構是這樣的:MongoDB:在數組匹配參數中查找子文檔

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

我怎麼能告訴MongoDB中只返回我的文檔,如果開始時間爲數據子文檔小於5和結束時間相同的子文檔大於5 ?目前,如果我做

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

它總是會回到我的文檔,因爲5大於0和小於18我怎麼能告訴MongoDB中只返回我的文檔,如果5(或任何值)大於0並且小於2或大於15且小於18?

回答

61

您想使用$elemMatch

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

真棒這正是我需要的,謝謝! – 2012-08-06 06:31:11

1

跨越作弊這是不存在的代碼這篇文章的思想到了。)所以在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); 
+0

你可以給一個像使用嗎啡一樣的代碼片段嗎? – Newton 2016-06-06 06:32:59

相關問題