mongoid найти с помощью create_at с регулярным выражением не работает? - PullRequest
1 голос
/ 12 февраля 2012

Я использую mongoid с ruby ​​1.9.3. Коллекция насчитывает более 10 миллионов записей.

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 ]

3 голосов
/ 12 февраля 2012

Сам я не использую Mongoid, но вы уверены, что он поддерживает регулярные выражения при запросе с where? Это должно работать, хотя:

c = Contact.find(:all, :conditions => {:created_at => /^2012-02-10.*/}) 
2 голосов
/ 12 февраля 2012

Я не уверен, как 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/, чтобы можно было использовать индексы.

...