Mongodb 在日期之间从子文档获取数据
我试图从我的文档中获取一定数量的历史数据,类似于SQL的Between子句。我搜索了类似的问题并设法找到了这个查询,但它只返回数组的第一个元素,所以这还不够:Mongodb 在日期之间从子文档获取数据,mongodb,Mongodb,我试图从我的文档中获取一定数量的历史数据,类似于SQL的Between子句。我搜索了类似的问题并设法找到了这个查询,但它只返回数组的第一个元素,所以这还不够: db.docs.find({ _id: "eraj4983tj3" }, {history: { $elemMatch : {time: {$gt: new ISODate("2016-03-21T20:53:33.662Z") , $lt: new ISODate("2016-03-21T20:54:20.313Z") } } } })
db.docs.find({ _id: "eraj4983tj3" }, {history: { $elemMatch : {time: {$gt: new ISODate("2016-03-21T20:53:33.662Z") , $lt: new ISODate("2016-03-21T20:54:20.313Z") } } } });
我的文档如下所示:
{
"_id": "eraj4983tj3",
"descr": "somestuff",
"history": [
{
"time": ISODate("2016-03-21T20:52:31.389Z"),
"value": 103.91
},
{
"time": ISODate("2016-03-21T20:53:33.663Z"),
"value": 106.91
},
{
"time": ISODate("2016-03-21T20:53:45.179Z"),
"value": 104.91
},
{
"time": ISODate("2016-03-21T20:54:20.313Z"),
"value": 105.11
},
{
"time": ISODate("2016-03-21T20:54:53.649Z"),
"value": 105.41
},
{
"time": ISODate("2016-03-21T20:55:12.998Z"),
"value": 115.91
}
]
}
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:52:31.389Z"), "value" : 103.91 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:33.663Z"), "value" : 106.91 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:45.179Z"), "value" : 104.91 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:54:20.313Z"), "value" : 105.11 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:54:53.649Z"), "value" : 105.41 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:55:12.998Z"), "value" : 115.91 } }
我的查询结果应返回以下内容:
{
"_id": "eraj4983tj3",
"history": [
{
"time": ISODate("2016-03-21T20:53:45.179Z"),
"value": 104.91
},
{
"time": ISODate("2016-03-21T20:54:20.313Z"),
"value": 105.11
},
{
"time": ISODate("2016-03-21T20:54:53.649Z"),
"value": 105.41
}
]
}
如何编写查询以获得此结果?位置运算符
$
和elemMatch
将只返回一个子文档。位置运算符$
和elemMatch
将只返回一个子文档。简单的查询无法实现您想要的结果。但是,您可以使用聚合:
db.yourColl.aggregate([
{ $match:{ _id:"eraj4983tj3" } },
{ $unwind: "$history" },
{ $match:{ "history.time":{
$gt: new ISODate("2016-03-21T20:53:33.662Z") ,
$lt: new ISODate("2016-03-21T20:54:20.313Z")
}}},
{ $group:{ _id:"$_id", history:{ $push:"$history" }}}
])
这会给你正确的结果
{
"_id" : "eraj4983tj3",
"history" : [
{ "time" : ISODate("2016-03-21T20:53:33.663Z"), "value" : 106.91 },
{ "time" : ISODate("2016-03-21T20:53:45.179Z"), "value" : 104.91 }
]
}
现在,让我们检查一下各个阶段:
{
"_id": "eraj4983tj3",
"descr": "somestuff",
"history": [
{
"time": ISODate("2016-03-21T20:52:31.389Z"),
"value": 103.91
},
{
"time": ISODate("2016-03-21T20:53:33.663Z"),
"value": 106.91
},
{
"time": ISODate("2016-03-21T20:53:45.179Z"),
"value": 104.91
},
{
"time": ISODate("2016-03-21T20:54:20.313Z"),
"value": 105.11
},
{
"time": ISODate("2016-03-21T20:54:53.649Z"),
"value": 105.41
},
{
"time": ISODate("2016-03-21T20:55:12.998Z"),
"value": 115.91
}
]
}
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:52:31.389Z"), "value" : 103.91 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:33.663Z"), "value" : 106.91 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:45.179Z"), "value" : 104.91 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:54:20.313Z"), "value" : 105.11 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:54:53.649Z"), "value" : 105.41 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:55:12.998Z"), "value" : 115.91 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:33.663Z"), "value" : 106.91 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:45.179Z"), "value" : 104.91 } }
\u id
(此处无新内容)进行分组,对于上述阶段输出的每个文档,我们将其历史记录的值(对象)添加到新创建的分组文档中的数组历史记录中
用一个简单的查询是不可能得到您想要的。但是,您可以使用聚合:
db.yourColl.aggregate([
{ $match:{ _id:"eraj4983tj3" } },
{ $unwind: "$history" },
{ $match:{ "history.time":{
$gt: new ISODate("2016-03-21T20:53:33.662Z") ,
$lt: new ISODate("2016-03-21T20:54:20.313Z")
}}},
{ $group:{ _id:"$_id", history:{ $push:"$history" }}}
])
这会给你正确的结果
{
"_id" : "eraj4983tj3",
"history" : [
{ "time" : ISODate("2016-03-21T20:53:33.663Z"), "value" : 106.91 },
{ "time" : ISODate("2016-03-21T20:53:45.179Z"), "value" : 104.91 }
]
}
现在,让我们检查一下各个阶段:
{
"_id": "eraj4983tj3",
"descr": "somestuff",
"history": [
{
"time": ISODate("2016-03-21T20:52:31.389Z"),
"value": 103.91
},
{
"time": ISODate("2016-03-21T20:53:33.663Z"),
"value": 106.91
},
{
"time": ISODate("2016-03-21T20:53:45.179Z"),
"value": 104.91
},
{
"time": ISODate("2016-03-21T20:54:20.313Z"),
"value": 105.11
},
{
"time": ISODate("2016-03-21T20:54:53.649Z"),
"value": 105.41
},
{
"time": ISODate("2016-03-21T20:55:12.998Z"),
"value": 115.91
}
]
}
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:52:31.389Z"), "value" : 103.91 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:33.663Z"), "value" : 106.91 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:45.179Z"), "value" : 104.91 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:54:20.313Z"), "value" : 105.11 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:54:53.649Z"), "value" : 105.41 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:55:12.998Z"), "value" : 115.91 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:33.663Z"), "value" : 106.91 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:45.179Z"), "value" : 104.91 } }
\u id
(此处无新内容)进行分组,对于上述阶段输出的每个文档,我们将其历史记录的值(对象)添加到新创建的分组文档中的数组历史记录中
您可以根据需要编写查询:数组没有保证的顺序。你的数据建模显然是错误的。我不是问订单,我只是需要两个日期之间的数据。见下文。另外,它是未定义的哪些潜在文档。你说它未定义是什么意思?我需要查询中指定id的文档中的数据。Undefined==可以是任意顺序。以
[a,b,c,d]
为例。根据许多因素,它可能以这种方式返回,也可能以[b,a,d,c]
或任何其他顺序返回。您可以根据需要编写查询:数组没有保证的顺序。你的数据建模显然是错误的。我不是问订单,我只是需要两个日期之间的数据。见下文。另外,它是未定义的哪些潜在文档。你说它未定义是什么意思?我需要查询中指定id的文档中的数据。Undefined==可以是任意顺序。以[a,b,c,d]
为例。根据许多因素,它可能以这种方式返回,也可能以[b,a,d,c]
或任何其他顺序返回。该查询只返回一个时间-值对,如下所示:{“\u id”:“eraj4983tj3”,“history”:[{“time”:ISODate(“2016-03-21T20:53:33.663Z”),“value”:106.91},无论我在$gt和$lt运算符之间留有多长的时间。我需要接收日期之间的所有条目,而不仅仅是一个。很抱歉,这些运算符只返回一个。该查询只返回一个时间-值对,如:{“_id”:“eraj4983tj3”,“history”:[{“time”:ISODate(“2016-03-21T20:53:33.663Z”),“value”:106.91},无论我在$gt和$lt运算符之间留的时间有多长。我需要接收日期之间的所有条目,而不仅仅是一个。对不起,那些操作员只返回一个。