Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我可以按日期查询MongoDB ObjectId吗?_Javascript_Mongodb - Fatal编程技术网

Javascript 我可以按日期查询MongoDB ObjectId吗?

Javascript 我可以按日期查询MongoDB ObjectId吗?,javascript,mongodb,Javascript,Mongodb,我知道objectid包含它们创建的日期。有没有办法从文档中查询ObjectId的这一方面 o = new ObjectId() date = o.getTimestamp() 这样你就有了一个ISODate 看 . 有关ObjectId的前4个字节的详细信息,要按时间顺序查询集合,只需按id排序: # oldest first; use pymongo.DESCENDING for most recent first items = db.your_collection.find().sor

我知道objectid包含它们创建的日期。有没有办法从文档中查询ObjectId的这一方面

o = new ObjectId()
date = o.getTimestamp()
这样你就有了一个ISODate

看 .
有关ObjectId的前4个字节的详细信息,要按时间顺序查询集合,只需按id排序:

# oldest first; use pymongo.DESCENDING for most recent first
items = db.your_collection.find().sort("_id", pymongo.ASCENDING)
获取文档后,您可以获得ObjectId,如下所示:

详细介绍了基于ObjectId中嵌入的日期的查询

在JavaScript代码中简要介绍:

/* This function returns an ObjectId embedded with a given datetime */
/* Accepts both Date object and string input */

function objectIdWithTimestamp(timestamp) {
    /* Convert string date to Date object (otherwise assume timestamp is a date) */
    if (typeof(timestamp) == 'string') {
        timestamp = new Date(timestamp);
    }

    /* Convert date object to hex seconds since Unix epoch */
    var hexSeconds = Math.floor(timestamp/1000).toString(16);

    /* Create an ObjectId with that hex timestamp */
    var constructedObjectId = ObjectId(hexSeconds + "0000000000000000");

    return constructedObjectId
}


/* Find all documents created after midnight on May 25th, 1980 */
db.mycollection.find({ _id: { $gt: objectIdWithTimestamp('1980/05/25') } });

使用MongoObjectID,您还应该找到如下所示的结果

db.mycollection.find({ _id: { $gt: ObjectId("5217a543dd99a6d9e0f74702").getTimestamp().getTime()}});

使用Node.js中mongodb驱动程序提供的内置函数,可以按任意时间戳进行查询:

var timestamp = Date.now();
var objectId = ObjectID.createFromTime(timestamp / 1000);
或者,要在当前时间之前搜索记录,只需执行以下操作:

var objectId = new ObjectID(); // or ObjectId in the mongo shell
资料来源:

在pymongo,可以这样做:

import datetime
from bson.objectid import ObjectId
mins = 15
gen_time = datetime.datetime.today() - datetime.timedelta(mins=mins) 
dummy_id = ObjectId.from_datetime(gen_time)
result = list(db.coll.find({"_id": {"$gte": dummy_id}}))

为了获取mongo集合中最后60天的文档,我在shell中使用了下面的查询

db.collection.find({_id: {$lt:new ObjectId( Math.floor(new Date(new Date()-1000*60*60*24*60).getTime()/1000).toString(16) + "0000000000000000" )}})

如果要进行范围查询,可以像中那样进行。例如,查询特定日期,即2015年4月4日:

> var objIdMin = ObjectId(Math.floor((new Date('2015/4/4'))/1000).toString(16) + "0000000000000000")
> var objIdMax = ObjectId(Math.floor((new Date('2015/4/5'))/1000).toString(16) + "0000000000000000")
> db.collection.find({_id:{$gt: objIdMin, $lt: objIdMax}}).pretty()

如何查找从日期[2015-1-12]到日期[2015-1-15]的命令:

将本日期[2015-1-12]的命令计数到本日期[2015-1-15]:

从日期[2015-1-12]到日期[2015-1-15]删除命令:

从4.0版本开始,您可以使用函数从ObjectId提取日期

差不多

$convert: { input: "$_id", to: "date" } 
您可以查询日期,比较日期的开始时间和结束时间

db.collectionname.find({
  "$expr":{
    "$and":[
      {"$gte":[{"$convert":{"input":"$_id","to":"date"}}, ISODate("2018-07-03T00:00:00.000Z")]},
      {"$lte":[{"$convert":{"input":"$_id","to":"date"}}, ISODate("2018-07-03T11:59:59.999Z")]}
    ]
  }
})

你可以用速记来达到同样的目的

db.collectionname.find({
  "$expr":{
    "$and":[
      {"$gte":[{"$toDate":"$_id"}, ISODate("2018-07-03T00:00:00.000Z")]},
      {"$lte":[{"$toDate":"$_id"},ISODate("2018-07-03T11:59:59.999Z")]}
    ]
  }
})
在rails mongoid中,您可以使用

  time = Time.utc(2010, 1, 1)
  time_id = ObjectId.from_time(time)
  collection.find({'_id' => {'$lt' => time_id}})

是的,您可以使用MongoDB插入ID按日期查询对象

db.collectionname.find({_id: {$lt: ObjectId.fromDate( new ISODate("TZformat") ) } });
假设用户是我的收藏,我希望所有用户都在2018年1月5日之前创建

db.users.find({_id: {$lt: ObjectId.fromDate( new ISODate("2018-01-05T00:00:00.000Z") ) } });
对于从查询运行,我们可以使用

db.users.find({_id: {$lt: ObjectId.fromDate(new Date((new Date().getTime() - (1 * 3 * 60 * 60 * 1000))) ) } })
在MongoDB Compass中过滤当前时间-3小时内的所有用户。 根据版本:

罗盘版本:1.25.0 MongoDB版本:4.2.8 备选案文1: @s7vr的答案对我来说非常有效。您可以将其粘贴到过滤器字段中:

{$expr: { $and: [ {$gte: [{$toDate: "$_id"}, ISODate('2021-01-01')]}, {$lt: [{$toDate: "$_id"}, ISODate('2021-02-01')]} ] } }
备选案文2: 我还发现这是可行的,记住日期的月份参数是基于0的索引,所以一月是0:

{_id: {$gte: ObjectId(Date(2021, 0, 1) / 1000), $lt: ObjectId(Date(2021, 1, 1) / 1000) } }
备选案文3: 等同于ISODate:

{_id: {$gte: ObjectId(ISODate('2021-01-01') / 1000), $lt: ObjectId(Date('2021-02-01') / 1000) } }
在写了这篇文章之后,我决定对这些问题进行解释。以下是有关性能的最新消息:

选项1:39毫秒,使用0个索引,COLLSCAN中30毫秒 选项2:0毫秒,已使用id索引 选项3:1毫秒,使用id索引,取数1毫秒
根据我的初步分析,方案2似乎是最有效的。我个人将使用选项3,因为使用ISODate比记住日期对象中基于0的月份索引要干净一些。

我希望有一种方法能够真正允许做一些事情,比如使用ObjectId中嵌入的时间获取在特定时间之前创建的对象数,但这似乎无法直接访问。谢谢。你可以这样做,看看Leftium的答案。非常方便。。仅供参考,您可以将此函数保存在文件中,以便在mongo shell启动时可用。I get ReferenceError:ObjectId未定义。我如何解决这个问题?我正在使用nodejs和mongodbnative。通过包含var ObjectId=require'mongodb'.ObjectId,修复了未定义的错误;如果您像我一样使用Mongoskin:ChangeObjectdExSeconds+0000000000000000;到db.ObjectID.createFromHexStringhexSeconds+0000000000000000;或者,在Mongoose中,将ObjectId替换为:require'Mongoose'。Types.ObjectId-其中require'Mongoose'是您初始化/配置的Mongoose实例。注意,使用datetime.datetime.utcnow或datetime.datetime.today将返回相同的结果。datetime是为您处理的。或者,在不使用pymongo依赖项的情况下:epoch\u time\u hex=formatinttime.time,'x'不要忘记为您的查询添加零。时间包用于导入时间。意识到OP要求使用javascript,但这确实帮助我简化了代码。谢谢。这是从javascript环境中的时间戳创建ObjectId的最好/最简单的方法。这就是op所要求的……您的查询语句假设您知道ObjectId值,但情况并非总是如此。请使用$gt而不是$lt。否则,它会查找今天之前插入的文档—60天。@Vivek的前4个字节表示自unix纪元1970/1/1 00:00:00 UTC以来的秒数,因此,您可以将其与大于$gt和小于$lt一起使用,以查找在特定窗口中创建的对象。可能与我在上获得的解决方案重复,只是想询问使用$convert或$toDate时,Mongo必须首先转换,然后比较doc是否在范围内,但若我使用accepted answer的方法,那个么将日期转换为ObjectId只需在客户端执行一次,所以你们不认为这个解决方案会比这个更有效吗?无论如何,感谢您告诉我们,这两个运营商也存在:
db.users.find({_id: {$lt: ObjectId.fromDate(new Date((new Date().getTime() - (1 * 3 * 60 * 60 * 1000))) ) } })
{$expr: { $and: [ {$gte: [{$toDate: "$_id"}, ISODate('2021-01-01')]}, {$lt: [{$toDate: "$_id"}, ISODate('2021-02-01')]} ] } }
{_id: {$gte: ObjectId(Date(2021, 0, 1) / 1000), $lt: ObjectId(Date(2021, 1, 1) / 1000) } }
{_id: {$gte: ObjectId(ISODate('2021-01-01') / 1000), $lt: ObjectId(Date('2021-02-01') / 1000) } }