所以我有一个嵌入式文件,追踪小组成员身份。每个嵌入的文档都有一个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(如果你的语言支持)这两个很好的选择。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top