我想要查詢文檔中的數組元素的一個/多個匹配字段(也可以包括子文檔)。查詢具有完全匹配字段的數組的元素Java中的MongoDB
例如:
我的收藏包括以下文件:
{
"_id": 1,
"index": 1,
"elements":[
{
"name":"test",
"date":"Mon Sep 01 01:00:00 EEST 2014" ,
"tag":1
},
{
"name": "test2",
"date": "Mon Sep 01 01:00:00 EEST 2014",
"tag": 2
},
{
"name": "test",
"date": "Mon Sep 01 02:00:00 EEST 2014",
"tag": 3
}
]
},
{
"_id":2,
"index":2,
"elements":[
{
"name":"test",
"date":"Mon Sep 01 01:00:00 EEST 2014" ,
"tag":1
},
{
"name": "test2",
"date": "Mon Sep 01 01:00:00 EEST 2014",
"tag":2
},
{
"name":"test",
"date":"Mon Sep 01 01:10:00 EEST 2014",
"tag":3
}
]
},
{
"_id": 3,
"index": 3,
"elements": [
{
"name": "test",
"date": "Mon Sep 01 01:00:00 EEST 2014",
"tag":1
},
{
"name": "test2",
"date": "Mon Sep 01 01:00:00 EEST 2014",
"tag":2
},
{
"name": "test",
"date": "Mon Sep 01 01:10:00 EEST 2014",
"tag":3
}
]
}
我希望我的查詢結果返回我的文檔象下面這樣:
{
"_id":1,
"index": 1,
"elements":[
{
"name":"test",
"date":"Mon Sep 01 02:00:00 EEST 2014" ,
"tag":3
}
]
}
爲了提供這種我寫了一個查詢
Date dCriteria = new SimpleDateFormat("dd/MM/yy HH:mm:ss").parse("01/09/2014 05:00:00");
Query find = new Query(Criteria.where("index").is(3)); //To find matching documents
find.fields().elemMatch(
"elements",
Criteria.where("name").is("test").and("date").gte(dCriteria)));
mongotemplate.findOne(find, Document.class);
在MongoDB的shell命令這意味着爲:
db.collection.find(
{ "index": 3 },
{ "elements": {
"$elemMatch": {
"name": "test",
"date": {
"$gte": { "$date":"2014-09-01T02:00:000Z" }
}
}
}
)
但它返回以下結果:
{
"_id": 0,
"index": 0,
"elements":[
{
"name": "test",
"date": "Mon Sep 01 01:00:00 EEST 2014",
"tag":1
}
]
}
這是確定省略_id和指數的Fileds但它返回的第一macting元素數組由於匹配條件,要麼匹配「名稱」:「測試」或「日期」大於等於dCriteria,但我想要的是在同一時間匹配兩個標準。
爲了這一點,我必須使用$ elemMatch運營商查詢exatcly多個字段在一個數組元素的同時匹配。但我不知道如何在我的投影中使用它的語法。
嗨尼爾,其實我的問題是不符合日期。我也知道mongo使用UTC格式,不關心日期。我的問題是查詢結果。我可以將$ elemMatch條件放入搜索查詢中,以免在投影之前得到空白文檔,這很重要。但是問題來自於獲取數組元素中唯一匹配的數組元素。這意味着我應該使用(不確定)$ elemMatch與另一個elemMatch操作符來獲取我的查詢的匹配元素,這是字段名稱和測試。 – 2014-09-05 06:51:01
@ C.Kaya您的問題與日期。你得到錯誤元素的原因是因爲TimeZone差異的調整時間。您應該能夠基本上完成我在定義查詢結束時所做的工作。記錄輸出以查看序列化表單。您的代碼不會與您發佈到shell的查詢產生相同的結果。我在做什麼。 – 2014-09-05 07:01:08
我編輯我的時間格式,實際上我在我的帖子中使用。下面是我用過的匹配元素的查詢:Query:{「index」:1,「alarms」:{「$ elemMatch」:{「name」:「Test1」,「date」:{「$ gte」: {「$ date」:「2014-09-01T02:00:00.000Z」}}}}},Fields:{「alarms」:{「$ elemMatch」:{「name」:「Test1」,「date」: {「$ gte」:{「$ date」:「2014-09-01T02:00:00.000Z」}}}}},排序:null – 2014-09-05 07:20:19