Mongoexport日期范围查询结果解析失败

Mongoexport date range query result in Failure parsing

正在尝试 运行 mongoexport,但我的查询参数有问题。

mongoexport -d test-copy  -c collection -o /home/ubuntu/mongodb-archiving/mongodump/collection.json --query '{"created_at": {$lte: new Date(1451577599000) } }'

集合是:

{"created_at" : ISODate("2014-03-07T06:32:19.172Z")}

我可以在 Mongo 客户端中查询到它。

结果出现以下错误:

Assertion: 10340:Failure parsing JSON string near: "created_a

您的查询中有一个 \。请删除它。

--query '{"created_at": {$lte: new Date(1451577599000)}}'

mongoexportmongodump 工具需要 --query 参数的有效 JSON 对象。来自 https://docs.mongodb.com/manual/reference/program/mongodump/#cmdoption--query:

--query , -q

Provides a JSON document as a query that optionally limits the documents included in the output of mongodump.

You must enclose the query in single quotes (e.g. ') to ensure that it does not interact with your shell environment.

由于您传递给 mongoexport 的查询参数,命令失败,由于 new Date() 的存在 Javascript,它不是有效的 JSON 对象]声明。

所需的修改是简单地使用您提供的示例 ISODate() 对象,例如:

mongoexport -d test-copy  -c collection -o /home/ubuntu/mongodb-archiving/mongodump/collection.json --query '{"created_at": {$lte: ISODate("2014-03-07T06:32:19.172Z") } }'

您只需将 ISODate() 的内容替换为您需要的日期即可。

您应该将 $date 与 mongoexport 一起使用:

mongoexport.exe -h *HOST* -p *PORT* -q "{ 'created_at' : { '$lt' : { '$date' : '2014-03-07T06:32:19.172Z' } } }"

删除 $lte 并将其更改为在您的查询中引用的 "$lt" ,mongodump 应该可以正常工作。 在 mongodb 3.0.8

上测试
> use appdb
> db.testcoll.find({})
{ "_id" : 1, "created_at" : ISODate("2016-09-15T08:46:12.272Z") }
{ "_id" : 2, "created_at" : ISODate("2016-09-15T08:46:12.272Z") }
{ "_id" : 3, "created_at" : ISODate("2016-09-16T08:46:30.736Z") }
{ "_id" : 4, "created_at" : ISODate("2016-09-16T08:47:12.368Z") }
{ "_id" : 5, "created_at" : ISODate("2016-09-16T08:47:15.562Z") }

> db.testcoll.find({"created_at":{"$lt":new Date("2016-09-16")}})

{ "_id" : 1, "created_at" : ISODate("2016-09-15T08:46:12.272Z") }
{ "_id" : 2, "created_at" : ISODate("2016-09-15T08:46:12.272Z") }

> db.testcoll.find({"created_at":{"$lt":new Date(1473984000)}})

  // make sure you are using millisecond version of epoch
> db.testcoll.find({"created_at":{"$lt":new Date(1473984000000)}})

{ "_id" : 1, "created_at" : ISODate("2016-09-15T08:46:12.272Z") }
{ "_id" : 2, "created_at" : ISODate("2016-09-15T08:46:12.272Z") }

现在是 mongodump 部分:

dp@xyz:~$ mongodump -d appdb -c testcoll --query '{"created_at":{"$lt":new Date(1473984000000)}}'
2016-09-16T14:21:27.695+0530    writing appdb.testcoll to dump/appdb/testcoll.bson
2016-09-16T14:21:27.696+0530    writing appdb.testcoll metadata to dump/appdb/testcoll.metadata.json
2016-09-16T14:21:27.708+0530    done dumping appdb.testcoll (2 documents)