mongodb 如何使用mongodump转储与特定日期范围匹配的记录?

zpf6vheq  于 2023-04-05  发布在  Go
关注(0)|答案(9)|浏览(156)

我尝试使用mongodump命令转储一堆在特定日期创建的记录。这些记录包括一个“ts”字段,它是MongoDB Date()对象。
mongodump接受一个-q参数,该参数可用于运行查询以选择要包含在转储中的记录。不幸的是,-q参数需要在JSON中提供,并且不清楚如何在纯JSON中表达“小于此日期,大于此日期”查询(通常此类查询将使用'new Date()'构造函数)
有什么提示吗?我已经尝试使用{$date:unix-timestamp-in-milliseconds}格式,但它对我不起作用。

k4aesqcs

k4aesqcs1#

我解决了-我在找的咒语是:

mongodump --query "{\"ts\":{\"\$gt\":{\"\$date\":`date -d 2011-08-10 +%s`000},\"\$lte\":{\"\$date\":`date -d 2011-08-11 +%s`000}}}"
mbskvtky

mbskvtky2#

一个比@SimonWillison的转义版本更人性化的版本:
--query "{ time: { \$gt: new Date(1312959600000), \$lt: new Date(1313046000000) }}"
(Note美元符号仍然需要转义。)
我通过在shell中创建日期来获得毫秒时间戳,例如:

> var targetDateStart = new Date(2011, 7, 10);
> var targetDateEnd = new Date(2011, 7, 11);
> targetDateStart.getTime();
1312959600000
> targetDateEnd.getTime();
1313046000000
vd8tlhqk

vd8tlhqk3#

在MongoDB 3.2中,我们可以在mongodump中使用--queryFile选项。
首先,创建一个json文件:

//query.json
{"serverTime": {"$gte": ISODate("2016-01-30T16:00:00.000Z"), "$lt": ISODate("2016-01-31T16:00:00.000Z")}}

接下来,使用mongodump:

mongodump --db <dbName> --collection <collectionName> --queryFile query.json

简单明了。

egmofgnx

egmofgnx4#

编辑:固定的错别字
添加更新:

  1. mongodump --query不支持IsoDate,但接受毫秒形式的Date
  • 由于date命令在OS X中的行为不同,date -d 2011-08-10 +%s对我不起作用。如果您遇到相同的问题,请尝试阅读手册或使用此:
  • 获取当前时间(秒):
date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"
  • 获取以秒为单位的特定时间:
date -j -f "%Y-%m-%d %H:%M:%S" "2014-01-01 00:00:00"  "+%s"
  • 使用单引号版本以避免转义。
mongodump --query '{updated_at: { $gte: Date(1403280000000) } }'
7vhp5slm

7vhp5slm5#

这应该可以工作,你的$date查询有什么不起作用?:

mongodump --query  {"ts":{$gt:{$date:178929000}}}
oug3syen

oug3syen6#

使用单引号。我发现ISODate()不起作用。

mongodump --query  '{"ts":{$gt:{$date:178929000}}}'
swvgeqrz

swvgeqrz7#

扩展的JSON格式工作,可以在文档(https://docs.mongodb.com/database-tools/mongodump/)中找到。示例:
--query '{ "timest": { "$gte": { "$date": "2020-08-19T00:00:00.000Z" } } }'

tct7dpnv

tct7dpnv8#

在我的例子中,我查询了14天前创建的条目,最终得到了这个bash脚本:

#!/bin/bash
date_now=`date +%s%3N`
date_2weeks_ago=$[date_now - 14 * 24 * 60 * 60 * 1000]
query=$(printf '{ createdAt: { $gte: Date(%d) } }' $date_2weeks_ago)
echo $query > query.json
mongodump \
--collection=data \
--queryFile=query.json
rm query.json

mongodump版本:r4.0.12

oymdgrw7

oymdgrw79#

mongodump版本100中,我无法让以前的解决方案工作。
这是一个为我工作的解决方案:

  • 获取您想要获取记录的日期时间的unix epoch。最简单的方法可能是在浏览器控制台或Javascript REPL中运行new Date(<your date>).getTime()

示例:new Date('2022-07-01').getTime()-〉1656633600000

  • 创建一个json查询文件,例如queryFile.json
{
  "updatedAt": {
    "$gt": { "$date": 165662640000 }
  }
}
  • 通过使用以下命令指定queryFile参数来运行mongodump
mongodump --db <dbName> --collection <collectionName> --queryFile queryFile.json

相关问题