mongoid由created_at查找正则表达式不起作用?

时间:2012-02-12 09:43:27

标签: ruby mongodb mongoid

我正在使用mongoid和ruby 1.9.3。收藏有超过1000万条记录。

c = Contact.where(created_at: "2012-02-10 08:49:05 UTC")
c.count
#=> 2

然而,当我使用正则表达式时,没有找到记录:

c = Contact.where(created_at: "/.*2012-02-10.*/")
c.count
#=> 0

2 个答案:

答案 0 :(得分:3)

我自己不使用Mongoid,但是你确定它在使用where查询时支持正则表达式吗?这应该工作:

c = Contact.find(:all, :conditions => {:created_at => /^2012-02-10.*/}) 

答案 1 :(得分:2)

我不确定Mongoid是如何做到这一点的,但是想要进入MongoDB的查询是这样的:

db.contact.find({
    created_at: {
        $gte: ISODate('2012-02-10'),
        $lt:  ISODate('2012-02-11')
    }
})

请注意,我们从$gte开始,以$lt结束,以获得半开放间隔[2012-02-10, 2012-02-11),这与将完整时间截断为日期部分相同。

使用MongoMapper我会说:

Concat.where(
    :created_at => {
        :$gte => Time.new(2012, 2, 10),
        :$lt  => Time.new(2012, 2, 11)
    }
)

也许同样的事情适用于Mongoid。

另外,这个:

"/.*2012-02-10.*/"

是一个字符串,您可能希望/.*2012-02-10.*/将正则表达式下载到MongoDB。那对于MongoMapper是行不通的,所以我怀疑你不能在Mongoid上使用正则表达式;他们两个可能只是将这种东西交给较低级别​​的MongoDB连接层。在任何情况下,你几乎都不想使用像MongoDB那样的正则表达式,因为它无法使用索引,你想要在开头/^2012-02-10/锚定它,这样索引就可以了使用