2015-09-29 24 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]' 
    } 
});