Могут ли строгие даты JSON $использоваться в запросе MongoDB?
Я пытаюсь написать запрос сравнения даты, используя MongoDB строковое представление JSON BSON.
Мне бы хотелось, чтобы он работал в оболочке MongoDB (v2.4.3)
Вот что я пробовал...
Настройка: создайте новый документ с датой at
от 1 января 2020 года
> db.myTimes.insert({"at": new Date("2020-01-01")})
Использование нестрого запроса для даты > 2010, без проблем:
> db.myTimes.find({"at": {"$gt": new Date("2010-01-01")}})
{ "_id" : ObjectId([snipped]), "at" : ISODate("2020-01-01T00:00:00Z") }
Использование строгого запроса JSON, однако... NO DICE
> db.myTimes.find({"at": {"$gt": {"$date":"2010-01-01T00:00:00Z"}}})
> db.myTimes.find({"at": {"$gt": {"$date":"2010-01-01"}}})
> db.myTimes.find({"at": {"$gt": {"$date": 1262304000000}}})
> db.myTimes.find({"at": {"$lte": {"$date": 1262304000000}}})
(Как вы можете видеть, я пробовал даты ISO8601, времена эпохи, а также менял свой $gt
на $lte
на теорию о том, что они будут взаимоисключающими, поэтому один из них должен что-то вернуть: -)
Спасибо за любые указатели!
-B
Ответы
Ответ 1
Я не уверен, но все говорит о том, что невозможно построить правильный запрос, используя строгий JSON. Хотя вы можете запускать объединение запросов $date
с $gt
, $gte
, $lt
, $lte
, кажется, как и в вашем случае, всегда оцениваться как false
.
Когда вы объединяете $date
с $ne
или $nin
, он будет соответствовать каждому документу в коллекции, поэтому я думаю, что он подтверждает предыдущее наблюдение.
Что более важно, когда вы пытаетесь получить точное соответствие, подобное db.foo.find({at: {"$date":"2010-01-01T00:00:00Z"}})
, вы получите недопустимую ошибку оператора (10068).
Мое предположение: когда пытайтесь создать документ в оболочке Mongo с помощью $date
doc = {at: {"$date":"2010-01-01T00:00:00Z"}}
он не оценивается как дата, и нет способа вставить такой документ в коллекцию.
Как вы видите, кажется, что строгий JSON корректно анализируется только с помощью таких инструментов, как mongoimport
.
Здесь есть аналогичный вопрос: Есть ли способ запустить оболочку MongoDB (или метод tojson) в строгом режиме JSON?.
Ответ 2
Оболочка mongo не поддерживает режим Strict JSON. Посмотрите этот билет: https://jira.mongodb.org/browse/SERVER-6813.
Эта библиотека здесь может делать то, что вы ищете (хотя я ее еще не пробовал): https://www.npmjs.com/package/mongodb-extended-json. Я не использую оболочку mongo для чего-либо сложного, поэтому я не знаю, как и как вы можете заставить это работать в оболочке.
В качестве побочного примечания, если вы хотите использовать другой язык, я использую следующий код для pymongo.
import bson.json_util
mongo_queryD = bson.json_util.loads(mongo_query_str)
db.collection.find(mongo_queryD)
К сожалению, это будет работать только для двух последних примеров с меткой времени в формате int64.