Mongo - 将null或undefined视为特定值

时间:2015-09-29 12:09:15

标签: mongodb mongodb-query

我有以下情况:

考虑一个包含以下文件的集合:

 [
   {
      '_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,则查询会返回结果中的文档。

3 个答案:

答案 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)

  1. 尝试在插入本身时将日期值设为0。它可以帮助您执行查询。
  2. 如果该集合已存在,您可以使用更新查询更新日期字段。
  3. 使用mongo的投影技术插入一个新字段,例如newDate,其值为0或实际日期。之后在newDate字段上使用过滤器查询。

答案 2 :(得分:0)

如果您要排除date等于null或不存在的结果,则

db.getCollection('validation_archive').find({
  date: {
    $ne: null,
    $lt: '[date_here]',
    $gt: '[date_here]'
  }
});
相关问题