2015-09-29 22 views
1

我有以下情况:蒙戈 - 治疗无效或未定义fieled为特定值

考虑采用以下文档的集合:

[ 
    { 
     '_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]'}}});

所有的工作都很好,除了空字段或不存在的字段。

有反正我可以告诉mongo把null当作'0000-00-00 00:00:00'吗?

编辑:我需要这样做,所以如果在$ gt中发送的日期是0000-00-00 00:00:00,查询将返回结果中的文档。

回答

2

在一般查询则没有。你总是可以从结果exlude他们作为:

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 } } 
    ] 
}) 

这是很多更有效。

因此,有可能将“项目”作为不存在的日期,但它只是简单地使用基本查询操作而非常有意义。

+0

我不想从结果中排除它们,如果$ gt/$ gte参数为'00 -00-00',我想将它们包含在结果中。他们默认排除在外。编辑的问题来反映这一点。 – zozo

+0

@zozo你需要考虑一下,因为“00-00-00”不在“2015-01-01”和“2015-12-01”的范围内。这就是为什么我说*“有什么意义”*。如果需要的话,你总是可以使用'$ project'并通过'.aggregate()'添加'$或'条件。 –

+0

@zozo甚至为你增加了一个例子。 –

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

如果你想排除具有date结果等于null或不存在,那么

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