あなたは正しい方向に進んでいますが、ネストされた配列(特に匿名キーを使用)は物事を格納するための優れた方法ではないという部分を除いて、ここで注意すべきことがいくつかありますが、常に位置を知っている限り、それはかなり大丈夫なはずです。
一致するドキュメントには明確な違いがあります 一致する「配列の要素」 。現在の値は実際には一致しませんが(検索値はドキュメントの範囲内にありません)、値が実際に有効である場合、クエリは"ドキュメント"と正しく一致します。 ここには、配列内の一致する要素が含まれています。
「ドキュメント」 すべてが含まれています 配列要素のうち、一致しないものも含まれますが、条件には "document" 一致するので、返されます。一致する"要素"だけが必要な場合 次に、 .aggregate()
を使用します 代わりに:
db.infos.aggregate([
// Still match the document
{ "$match": {
"info": {
"$elemMatch": { "0": {"$gte": 1399583285000} }
}
}},
// unwind the array for the matched documents
{ "$unwind": "$info" },
// Match only the elements
{ "$match": { "info.0": { "$gte": 1399583285000 } } },
// Group back to the original form if you want
{ "$group": {
"_id": "$_id",
"info": { "$push": "$info" }
}}
])
そして、それは条件に一致した要素だけを返します:
{
"_id" : ObjectId("536c1145e99dc11e65ed07ce"),
"info" : [
[
1399583285000,
20.13
],
[
1399583286000,
20.13
]
]
}
または、1つしか期待していなかった場合はもちろん 要素を一致させる場合は、で投影を使用できます。 .find()
**:
db.infos.find(
{
"info":{
"$elemMatch":{
"0": {
"$gt": 1399583285000
}
}
}
},
{
"info.$": 1
}
)
しかし、 $gt
のような用語で ドキュメント内で複数のヒットが発生する可能性が高いため、位置的な$
を考慮すると、集計アプローチの方が安全です。 演算子は最初ののみを返します 一致します。