带有'或'条件的MongoDB查询

所以我有一个跟踪组成员身份的embedded式文档。 每个embedded式文档都有一个指向另一个集合中的组的ID,一个开始date和一个可选的过期date。

我想查询一个组的当前成员。 “当前”表示开始时间小于当前时间,并且到期时间大于当前时间或空值。

这个条件查询完全阻止了我。 我可以通过运行两个查询并合并结果来完成,但这看起来很难看,并且需要一次加载所有结果。 或者,我可以在很远的将来将过期时间默认为某个任意date,但这似乎更加丑陋,并且可能很脆弱。 在SQL中,我只是用“(expires> = Now())OR(expires IS NULL)”来表示它 – 但我不知道在Mongo中如何做到这一点。

有任何想法吗? 首先十分感谢。

只是以为我会更新在任何情况下,未来在这个网页上绊倒。 从1.5.3开始,mongo现在支持真正的$或operator: http : //www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or

你的查询“(expires> = Now())OR(expires IS NULL)”现在可以呈现为:

{$or: [{expires: {$gte: new Date()}}, {expires: null}]} 

如果有人觉得有用, http://www.querymongo.com会在SQL和MongoDB之间进行翻译,包括OR子句。; 当你知道SQL的等价物时,确定语法可能会非常有帮助。

在OR语句的情况下,看起来像这样

SQL:

 SELECT * FROM collection WHERE columnA = 3 OR columnB = 'string'; 

MongoDB的:

 db.collection.find({ "$or": [{ "columnA": 3 }, { "columnB": "string" }] }); 

在Mongo中默认查询对象和expression式。 Mongo目前不包含这样的查询的OR运算符,但是有方法来expression这样的查询。

使用“in”或“where”。

它会是这样的:

 db.mycollection.find( { $where : function() { return ( this.startTime < Now() && this.expireTime > Now() || this.expireTime == null ); } } ); 

使用$ where查询会很慢,部分原因是它不能使用索引。 对于这样的问题,我认为最好是为“expires”字段存储一个很高的值,这个值自然会比Now()大。 你可以在将来存储数百万年的很高的date,或者使用seporatetypes来表示永远不会。 交叉types的sorting顺序在http://www.mongodb.org/display/DOCS/Compare+Order+for+Types中定义。; 一个空的正则expression式或MaxKey(如果你的语言支持它)都是不错的select。