Могут ли строгие даты JSON $использоваться в запросе MongoDB? - программирование
Подтвердить что ты не робот

Могут ли строгие даты 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

4b9b3361

Ответ 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.