ドキュメントにある配列要素(サブドキュメントも含めることができます)の1つ以上の一致するフィールドを照会したいと思います。
例えば:
私のコレクションには、以下の文書が含まれています。
{
"_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 シェル コマンドでは次のようになります。
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 とインデックス フィールドを省略しても問題ありませんが、条件が一致するため、配列の最初の要素を返します。一致する "name":"test" または "date" は dCriteria と等しいですが、両方の条件に一致する必要があります。同時に。
これを行うには、$elemMatch 演算子を使用して、配列要素の複数のフィールドに同時に正確に一致するクエリを実行する必要があります。しかし、私のプロジェクションでその構文を使用する方法がわかりません。