根据 MongoDB 中的日期导出集合的子集
Export subset of a collection base on a Date in MongoDB
我正在尝试从 mongoDB
导出数据
mongoexport -d MY_DB_NAME -u DB_USER -p _REDACTED_ -c person \
-q "{ '$and':[ { 'hasActiveAck':{ '$ne':false }}, { 'creationDate':{'$gte': new Date(1506816000), '$lte': new Date(1509404400)} }]}" \
--fields '_id,email' --type=csv --out people_oct.json
问题是这提取了 0 行
如果我调用这个查询
db.getCollection('person')
.find({
$and:[
{
hasActiveAck:{
$ne:false
}
},
{
creationDate:{
$gte:new Date(1506816000) ,
$lte:new Date(1509408000)
}
}
]
}).count();
结果是 0
行
但是如果我 运行 使用 ISODate 而不是 Date 的查询是这样的:
db.getCollection('person')
.find({
$and:[
{
hasActiveAck:{
$ne:false
}
},
{
creationDate:{
$gte:ISODate("2017-10-01T00:00:00.000Z") ,
$lte:ISODate("2017-10-31T00:00:00.000Z")
}
}
]
}).count();
结果是 58k+ 行
我做错了什么?
一些细节:
mongoexport --version
mongoexport version: r3.2.11
git version: 45418a84270bd822db0d6d0c37a0264efb0e86d2
Go version: go1.7
os: linux
arch: amd64
compiler: gc
OpenSSL version: OpenSSL 1.0.1f 6 Jan 2014
mongo --version
MongoDB shell version: 3.0.14
mongod --version
db version v3.0.14
Date 构造函数采用毫秒数,而不是秒数。
new Date(1506816000).toISOString()
"1970-01-18T10:33:36.000Z"
new Date(1506816000000).toISOString()
"2017-10-01T00:00:00.000Z"
Integer value representing the number of milliseconds since January 1,
1970, 00:00:00 UTC, with leap seconds ignored (Unix Epoch; but
consider that most Unix timestamp functions count in seconds).
尝试将问题分成两个阶段。
第一阶段 将生成一个 collection 的愿望文档:
db.person.aggregate([
{ $match :
{ $and:[
{ hasActiveAck:{ $ne:false } },
{ creationDate:{
$gte:ISODate("2017-10-01T00:00:00.000Z")
,$lte:ISODate("2017-10-31T00:00:00.000Z")
}
}]
}
},
{
$out: "people_oct"
}
])
这里你必须$out
doc.
第二阶段将导出这个新的collection:
mongoexport --db MY_DB_NAME --collection people_oct --type=csv --out people_oct.json
我正在尝试从 mongoDB
导出数据mongoexport -d MY_DB_NAME -u DB_USER -p _REDACTED_ -c person \
-q "{ '$and':[ { 'hasActiveAck':{ '$ne':false }}, { 'creationDate':{'$gte': new Date(1506816000), '$lte': new Date(1509404400)} }]}" \
--fields '_id,email' --type=csv --out people_oct.json
问题是这提取了 0 行
如果我调用这个查询
db.getCollection('person')
.find({
$and:[
{
hasActiveAck:{
$ne:false
}
},
{
creationDate:{
$gte:new Date(1506816000) ,
$lte:new Date(1509408000)
}
}
]
}).count();
结果是 0
行
但是如果我 运行 使用 ISODate 而不是 Date 的查询是这样的:
db.getCollection('person')
.find({
$and:[
{
hasActiveAck:{
$ne:false
}
},
{
creationDate:{
$gte:ISODate("2017-10-01T00:00:00.000Z") ,
$lte:ISODate("2017-10-31T00:00:00.000Z")
}
}
]
}).count();
结果是 58k+ 行
我做错了什么?
一些细节:
mongoexport --version
mongoexport version: r3.2.11
git version: 45418a84270bd822db0d6d0c37a0264efb0e86d2
Go version: go1.7
os: linux
arch: amd64
compiler: gc
OpenSSL version: OpenSSL 1.0.1f 6 Jan 2014
mongo --version
MongoDB shell version: 3.0.14
mongod --version
db version v3.0.14
Date 构造函数采用毫秒数,而不是秒数。
new Date(1506816000).toISOString()
"1970-01-18T10:33:36.000Z"
new Date(1506816000000).toISOString()
"2017-10-01T00:00:00.000Z"
Integer value representing the number of milliseconds since January 1, 1970, 00:00:00 UTC, with leap seconds ignored (Unix Epoch; but consider that most Unix timestamp functions count in seconds).
尝试将问题分成两个阶段。
第一阶段 将生成一个 collection 的愿望文档:
db.person.aggregate([
{ $match :
{ $and:[
{ hasActiveAck:{ $ne:false } },
{ creationDate:{
$gte:ISODate("2017-10-01T00:00:00.000Z")
,$lte:ISODate("2017-10-31T00:00:00.000Z")
}
}]
}
},
{
$out: "people_oct"
}
])
这里你必须$out
doc.
第二阶段将导出这个新的collection:
mongoexport --db MY_DB_NAME --collection people_oct --type=csv --out people_oct.json