dzm*_*dzm 10 database mongodb mongodb-query aggregation-framework
我有一个文档设置如下:
{
_id : ObjectId(),
info : [
[
1399583281000,
20.13
],
[
1399583282000,
20.13
],
[
1399583283000,
20.13
],
[
1399583285000,
20.13
],
[
1399583286000,
20.13
]
]
}
Run Code Online (Sandbox Code Playgroud)
这些数据可以分布在多个文档中.通常,每个文档包含59个周期(秒)的信息中的数据.
我想要做的是获取时间戳大于特定时间的所有信息数据.
有什么想法我会这样做吗?
谢谢
编辑:
所以,我发现这似乎返回了所有文件:
db.infos.find({
info:{
$elemMatch:{
0:{
$gt:1399583306000
}
}
}
})
Run Code Online (Sandbox Code Playgroud)
但也许我需要在聚合查询中使用它?这样它只会返回所有值?
你在正确的轨道上,但这里有一些注意事项,除了嵌套数组(特别是匿名键)的部分不是一个很好的存储方式,但只要你一直知道位置然后这应该是合理的.
匹配文档和匹配"数组元素"之间存在明显差异.虽然您的当前值实际上不匹配(您的搜索值不在文档的范围内),但如果该值实际有效,则您的查询正确匹配此处的"文档",其中包含数组中的匹配元素.
在"文件"包含所有数组元素的,即使是那些不匹配,但状况说,"文件"不匹配,所以它被返回.如果你只想要匹配的"元素",那么请使用.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" }
}}
])
Run Code Online (Sandbox Code Playgroud)
并且只返回与条件匹配的元素:
{
"_id" : ObjectId("536c1145e99dc11e65ed07ce"),
"info" : [
[
1399583285000,
20.13
],
[
1399583286000,
20.13
]
]
}
Run Code Online (Sandbox Code Playgroud)
或者当然,如果你只想要一个元素匹配,那么你可以简单地使用投影.find()**:
db.infos.find(
{
"info":{
"$elemMatch":{
"0": {
"$gt": 1399583285000
}
}
}
},
{
"info.$": 1
}
)
Run Code Online (Sandbox Code Playgroud)
但是使用像$gt你这样的术语可能会在文档中获得多次命中,因此考虑到位置$运算符只会返回第一个匹配项,因此聚合方法会更安全.
| 归档时间: |
|
| 查看次数: |
11587 次 |
| 最近记录: |