当前位置: 首页 > 知识库问答 >
问题:

MongoDB查询中可以使用严格的JSON$日期吗?

姬实
2023-03-14

我试图使用MongoDB对BSON的严格JSON表示编写一个日期比较查询。

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

这是我试过的。。。

> db.myTimes.insert({"at": new Date("2020-01-01")})
> db.myTimes.find({"at": {"$gt": new Date("2010-01-01")}})
{ "_id" : ObjectId([snipped]), "at" : ISODate("2020-01-01T00:00:00Z") }
> 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

共有2个答案

欧旻
2023-03-14

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格式的示例。

申屠飞
2023-03-14

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

当您将$date$ne$nin组合时,它将匹配集合中的每个文档,因此我认为它证实了以前的观察。

当你试图获得像这样的精确匹配时,什么更重要。福。查找({at:{“$date”:“2010-01-01T00:00:00Z”})您将得到无效的运算符错误(10068)。

我猜是在Mongo shell中尝试使用$date

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

它不是作为日期计算的,也没有办法将这样的文档插入到集合中。正如您所见,严格的JSON似乎只有通过mongoimport等工具才能正确解析。这里也有类似的问题:有没有办法在严格的JSON模式下运行MongoDB shell(或tojson方法)?。

 类似资料:
  • 问题内容: 我知道ObjectIds包含创建日期。有没有办法查询ObjectId的这一方面? 问题答案: 将时间戳弹出到ObjectId中将详细介绍基于嵌入在ObjectId中的日期的查询。 简要介绍一下JavaScript代码:

  • 如果日期相同,则使用进行查询将无法正常工作。它更像是。 但如果我给query param加上1秒,它就会工作。 下面是示例查询; 我有一个文档,它是时间戳。 此查询与日期为的文档相匹配,如果我将查询时间戳增加一个,如。 我正在使用mongo控制台,但我在php中遇到了与MongoDate相同的问题 编辑:查询的输出 edit2:问题是mongo的php扩展。它记录了“当文档发送到/从数据库发送时,

  • 我试图将从PostgreSQL表中提取的字符串(使用索引聚合数组)转换为正确格式化的日期进行查询。我的问题是我的日期格式不同,包括YYYY、Mon-yyy和DD-Mon-y。我的计划是创建日期范围,以包含由模糊日期表示的所有可能时间。例如,“2000”将转换为“2000年1月1日”和“2000年12月31日”,并根据自定义输入日期范围进行测试。同样,“2014年2月”也将改为“2014年1月1日”

  • 问题内容: 我正在尝试在mongodb中执行查询日期,但结果始终为空。我的查询如下: //变量resultaMongo返回空。 Obs:我也尝试不使用.isoformat(),当我直接放入mongodb时,只有添加ISODate才返回结果。因此不会返回结果: 更重要的是,如果您编辑返回: 这是数据库中的记录序列: 如果我打印python的json变量,则会看到类似以下内容的内容: 我的Mongnd

  • 问题内容: 我在集合中将值存储为java.util.Date(),但是当我查询以获取两个特定日期之间的值时,最终得到的值超出了范围。这是我的代码: 插入 查询 当我在和之间查询时(基本上是fromDate = toDate),我得到的日期绝对不可能的对象。我在这里想念什么? 问题答案: 您正在执行的操作是仅在键覆盖中使用丢失运算符进行查询。您想要的是:

  • 问题内容: 我想在其他使用JSON的程序中使用某些MongoDB命令的原始输出。当我在蒙戈shell中运行命令,他们代表扩展JSON,在“shell模式”领域,具有特殊的领域,如,和。我看到的文档,以“严格模式”中引用,但我看不出有什么办法把它的壳,或像运行命令的方式在事情 做 输出严格JSON一样。如何强制Mongo输出符合标准的JSON? 问题答案: MongoDB shell讲Java语言,