在mongodb中如何选择具有一个嵌入文档但不包含另一个文档的文档?

时间:2011-08-21 01:22:26

标签: mongodb

是的,标题是满口的,但它是我能简洁地描述问题的最简单的方法:

我有一个看起来像这样的文件:

{ "_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}}}}})

但无济于事。我也尝试了不同的变化。

我希望我已经说清楚了,提前感谢任何帮助!!

1 个答案:

答案 0 :(得分:0)

一个简单的选择是在将来无限远地定义一个时间,并将任何活动文档设置为该结束时间。如果您将每个事件都放在{start:12345, end:999999999}表单中,那么您的查询就是start < time < end的简单测试。当文档不再使用时,您可以使用max-end-time查找事件,并将该时间更改为当前时间(简单更新)。