2017-10-12 75 views
0

我有一個存儲結構如下文檔的集合:
基於日期字段的「時間」從MongoDB的集合刪除文件

{ 
    "_id" : NumberLong(-6225637853094968071), 
    "Id" : "1585534", 
    "Type" : NumberInt(42), 
    "InDate" : ISODate("2017-10-05T18:30:00.000+0000"), 
} 
{ 
    "_id" : NumberLong(-622563784353458071), 
    "Id" : "15832422", 
    "Type" : NumberInt(42), 
    "InDate" : ISODate("2017-10-06T00:00:00.000+0000"), 
} 

我要刪除所有文件與特定的「標識」和「Type」,其中「InDate」字段的時間爲18:30:00.000+0000。我嘗試使用此查詢:

db.collection.remove({ 
"ChannelType": NumberInt(28), 
"HotelId": "1585534", 
"CheckInDate": /$18:30:00.000+0000/ 
}) 

但它不工作。這個怎麼做?

回答

1

正則表達式不會的東西的工作,是不是字符串使用isodate。實際上沒有簡單的方法來選擇一個BSON Date純粹是在一個普通的查詢表達式中的時間值。

爲了做到這一點,你應該提供一個$where條件與額外的邏輯,以匹配剛剛時間日期值的一部分。

基於對這個問題實際上提供的數據:

db.getCollection('collection').remove({ 
    "Id": "1585534", 
    "Type": NumberInt(42), 
    "$where": function() { 
    return this.InDate.getUTCHours() === 18 
     && this.InDate.getUTCMinutes() === 30 
    } 
}) 

這當然只是在提供的數據頭文件,即使它真的只是"Id"因爲該值反正確定是間獨特二。

.getUTCHours().getUTCMinutes()是JavaScript的Date對象的方法,這是怎麼一個$where表達式中使用時一個BSON Date表示。


中平凡,MongoDB的3.6(即將作爲寫入的)允許一個更有效的形式大於$where在聚合表達式:

db.getCollection('collection').aggregate([ 
    { "$match": { 
    "Id": "1585534", 
    "Type": NumberInt(42), 
    "$expr": { 
     "$and": [ 
     { "$eq": [{ "$hour": "$InDate" }, 18 ] }, 
     { "$eq": [{ "$minute": "$InDate" }, 30] } 
     ] 
    } 
    }} 
]) 

然而,這樣的表達式不能直接與方法如.remove().deleteMany()使用但$where表達式可以。

0

ISO日期不匹配的字符串,你需要在查詢過

db.collection.remove({ 
    "ChannelType": NumberInt(28), 
    "HotelId": "1585534", 
    "InDate": ISODate(2017-10-05T18:30:00.000+0000) 
}) 
+0

這也不會工作,因爲它不是一個有效的值。也許你應該在你回答之前在殼中嘗試過。 –

+0

試過了,只是錯誤的複製/過去。更新它。感謝您的錯誤 – sheplu

+1

我相信這個問題的精神是「不止一個可能的日期」,因此「只使用**時間**值」而不是整個日期。因此,爲什麼你首先嚐試了不正確的語法,因此即使仍然錯誤的語法得到糾正,爲什麼仍然不正確。 –