【发布时间】:2017-02-18 20:15:23
【问题描述】:
我的文档结构是这样的。我在哪里存储所有基于时间戳的事件。我的文档是这样的
[
{
"_id": {
"$oid": "589341cff92be305c034cb5a"
},
"__v": 0,
"name": "TV",
"switch_event": [
{
"timestamp": 1486186277826,
"event_type": "on"
},
{
"timestamp": 1486272677826,
"event_type": "off"
},
{
"timestamp": 1486099877826,
"event_type": "off"
},
{
"timestamp": 1486186277826,
"event_type": "on"
},
{
"timestamp": 1486272677826,
"event_type": "off"
},
{
"timestamp": 1486099877826,
"event_type": "off"
}
]
}
]
现在在查询此文档时,我只对今天发生的事件感兴趣。所以在查询这个之后我正在写这样的投影查询(为了测试我保持时间戳> 0,这应该给出所有事件) -
SwitchAppliance.find({_id:"589341cff92be305c034cb5a"},{
name:1,
switch_event:{$elemMatch: {
timestamp: {
$gt:0
}
}}
},(err,results)=>{
if(err) {console.log(err);return next({message: "Internal Server Error"});}
return res.json(results);
} );
但是当我得到结果时,我只在 switch_event 数组中得到一个事件对象——像这样——
[
{
"_id": "589341cff92be305c034cb5a",
"switch_event": [
{
"_id": "589567251c653a0890b8b1ef",
"event_type": "on",
"timestamp": 1486186277826
}
],
"name": "TV"
}
]
【问题讨论】:
-
查询投影 $elemMatch 只返回第一个匹配元素。您需要使用聚合来获取所有匹配的元素。不过,该模式似乎不是这个用例的最佳选择——这些数组到底能有多大?
-
真正的大...
-
这是一个更适合 MongoDB 用户 Google 小组的讨论,但您可以在 MongoDB 中搜索将不断增长的数组存储在单个文档中的问题,有很多关于此的文章。
-
谢谢@AsyaKamsky,你能帮我做聚合查询吗,我试着写了,但是没有用。
-
如果您将所有事件保存在一个数组中,您的架构将无法扩展,因此聚合只会延迟问题。
标签: mongodb mongoose mongodb-query