16

我正在尝试使用 MongoDB对 BSON的严格 JSON 表示来编写日期比较查询

我希望它在 MongoDB shell (v2.4.3) 中工作

这是我尝试过的...

设置:创建一个at日期为 2020 年 1 月 1 日的新文档

> 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 查询...没有 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

4

2 回答 2

5

我不确定,但一切都表明使用严格的 JSON 构建有效查询是不可能的。尽管您可以结合 , , 运行查询$date$gt$gte在您的情况下$lt$lte它似乎总是被评估为false.

当您$date$neor结合使用$nin时,它将匹配集合中的每个文档,因此我认为它证实了先前的观察。

更重要的是,当您尝试像这样获得完全匹配时,db.foo.find({at: {"$date":"2010-01-01T00:00:00Z"}})您将收到无效的操作员错误 (10068)。

我的猜测是当尝试在 Mongo shell 中创建文档时使用$date

doc = {at: {"$date":"2010-01-01T00:00:00Z"}}

它不会被评估为日期,也无法将这样的文档插入集合中。如您所见,严格的 JSON 似乎只能由mongoimport. 这里有类似的问题:Is there a way to run MongoDB shell (or tojson method) in strict JSON mode? .

于 2013-11-06T23:19:57.533 回答
3

mongo shell 不支持严格的 JSON 模式。请参阅这张票:https ://jira.mongodb.org/browse/SERVER-6813 。

这里的这个库可能会满足您的需求(尽管我还没有尝试过):https ://www.npmjs.com/package/mongodb-extended-json 。我不会将 mongo shell 用于任何复杂的事情,所以我不知道你是否或如何让它在 shell 中工作。

作为旁注,如果您愿意使用不同的语言,我将使用以下代码用于 pymongo。

import bson.json_util
mongo_queryD = bson.json_util.loads(mongo_query_str)
db.collection.find(mongo_queryD)

不幸的是,这仅适用于时间戳为 int64 格式的最后两个示例。

于 2015-03-17T13:03:54.217 回答