我有以下情况:
考虑一个包含以下文件的集合:
[
{
'_id': ObjectId('somehting'),
'date': null
},
{
'_id': ObjectId('somehting'),
},
{
'_id': ObjectId('somehting'),
'date': '2015-01-01 12:12:12'
},
many others
]
现在我有以下查询,查找日期介于值db.getCollection('validation_archive')之间的文件.find({'date':{$ lte:'[date_here]',{$ gte:'[date_here ]'}}});
除了具有null或不存在的字段外,一切正常。
无论如何,我可以告诉mongo将null视为'0000-00-00 00:00:00'?
编辑:我需要这样做,所以如果$ gt中发送的日期是00:00:00,则查询会返回结果中的文档。
答案 0 :(得分:3)
在一般查询中,然后没有。您可以随时从结果中排除它们,如下所示:
db.getCollection('validation_archive').find({
"date": { "$lte": date_to, "$gte" date_from, "$ne": null }
})
或者您可以使用.aggregate()
建议的“零”或“纪元”日期“包容”:
db.getCollection('validation_archive').aggregate([
{ "$redact": {
"$cond": {
"if": {
"$and": [
{ "$gte": [ date_from, { "$ifNull": [ "$date", new Date(0) ] } ] },
{ "$lte": [ date_to, { "$ifNull": [ "$date", new Date(0) ] } ] }
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
但是在你所要求的背景下,我们不得不问“有什么意义”。
或者即使你必须:
db.getCollection('validation_archive').aggregate([
{ "$project": {
"date": { "$ifNull": [ "$date", new Date(0) ] }
}},
{ "$match": {
"$or": [
{ "date": { "$lte": date_to, "$gte" date_from } },
{ "date": { "$eq": Date(0) } }
]
}}
])
这在结果中是完全包容的。
但是,为什么不做呢:
db.getCollection('validation_archive').find({
"$or": [
{ "date": { "$lte": date_to, "$gte" date_from },
{ "date": null },
{ "date": { "$exists": false } }
]
})
效率更高。
因此,可以将“项目”作为不存在的日期进行“投射”,但仅使用基本查询操作更有意义。
答案 1 :(得分:0)
答案 2 :(得分:0)
如果您要排除date
等于null
或不存在的结果,则
db.getCollection('validation_archive').find({
date: {
$ne: null,
$lt: '[date_here]',
$gt: '[date_here]'
}
});