我正在使用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
答案 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/
锚定它,这样索引就可以了使用