是的,标题是满口的,但它是我能简洁地描述问题的最简单的方法:
我有一个看起来像这样的文件:
{ "_id" : ObjectId("4e5044ecf9d7954533000002"), "events" : [
{
"state" : 1,
"time" : 1313882989,
},
{
"time" : 1313883005,
"state" : 0,
}
]}
您可以看到“events”是嵌入式文档的数组。 state:1表示该文档当时设置为“active”(以UTC为单位),状态:0表示此时设置为“inactive”。这基本上给了我这个文件有效的时间范围(从1313882989到1313883005)
现在我试图确定哪些文件在任何特定时间都处于活动状态,例如在1313883013,这是一个介于活动和非活动事件之间的时间。
我可以通过此查询得到一些信息:
db.plays.find({events:{$elemMatch:{state:1,time:{$lte:1313883013}}}})
它匹配一个完整的嵌入式文档,其中state = 1 AND time< 1313883013。但这还不够,因为我需要确保文档 在1313883013或之前也不包含 非活动事件。所以我试过这个:
db.plays.find({events:{$elemMatch:{state:1,time:{$lte:1313883013}},$not:{$elemMatch:{state:0,time:{$lte:1313883013}}}}})
但无济于事。我也尝试了不同的变化。
我希望我已经说清楚了,提前感谢任何帮助!!
答案 0 :(得分:0)
一个简单的选择是在将来无限远地定义一个时间,并将任何活动文档设置为该结束时间。如果您将每个事件都放在{start:12345, end:999999999}
表单中,那么您的查询就是start < time < end
的简单测试。当文档不再使用时,您可以使用max-end-time查找事件,并将该时间更改为当前时间(简单更新)。