题
所以我有一个嵌入式文件,追踪小组成员身份。每个嵌入的文档都有一个ID指向集团中另一个集合,开始日期,及 可选的 到期日期。
我想来查询目前的成员组中的一个。"当前"意味着开始时低于目前的时间,到期时间大于目前的时间或空。
这种有条件的查询是完全阻止我。我可以做的,它通过运行两个询问和合并的结果,但这似乎是丑陋的,需要加载的所有结果在一次。或者我也可以默认的到期时间到一些任意的日期在遥远的未来,但是,似乎即使是丑陋的和潜在的脆弱。在SQL我只是表达它与"(截止到>=Now())或(截止到是NULL)"-但我不知道如何去做,在Mongo.
任何想法?非常感谢。
解决方案
只是想我会更新,如果任何人碰到这个页面绊倒在未来。截至1.5.3,蒙戈现在支持一个真正的$或运营商: HTTP ://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or
您的查询 “(到期> = NOW())OR(期满IS NULL)” 现在可以被呈现为:
{$or: [{expires: {$gte: new Date()}}, {expires: null}]}
其他提示
在的情况下任何人发现它是有用的, 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"
}]
});
查询在蒙戈默认和表达式对象在一起。蒙戈当前不包括一个OR运算此类查询,但有方式表达这样的查询。
使用 “中的” 或 “其中”
它会是这样的:
db.mycollection.find( { $where : function() {
return ( this.startTime < Now() && this.expireTime > Now() || this.expireTime == null ); } } );
db.Lead.find(
{"name": {'$regex' : '.*' + "Ravi" + '.*'}},
{
"$or": [{
'added_by':"arunkrishna@aarux.com"
}, {
'added_by':"aruna@aarux.com"
}]
}
);
使用 $where
查询将是缓慢的,部分是因为它不能使用索引。对于这类问题,我认为它将是最好的储存的一个高价值的"到期"领域,将自然总是比现在更大().你可以储存有很高的日期,数百万年的未来,或者使用一个单独的类型,以指示从来没有。截类型排列顺序是定义 在这里,.
一个空Regex或MaxKey(如果你的语言支持)这两个很好的选择。