2016-01-26 36 views
1

我有一個文件,它看起來像這樣刪除元素:MongoDB的更新只是一個時間戳字段

{ 
    "events": [ 
     { 
      "timestamp": ISODate("2015-12-08T13:35:40.797Z") 
     }, 
     { 
      "timestamp": ISODate("2015-12-08T13:36:40.753Z"), 
      "type" : "StatusSetEvent" 
     }, 
     { 
      "timestamp" : ISODate("2015-12-09T10:38:34.551Z") 
     }, 
     { 
      "status" : "in_progress", 
      "timestamp" : ISODate("2016-01-15T10:49:23.037Z"), 
      "type" : "StatusSetEvent" 
     } 
    ] 
} 

我想從這個文件,它剛剛timestamp字段中刪除所有事件。 我試着用

db.collection.update(
    { }, 
    { $pull: { events: 
     { $elemMatch: 
      { timestamp: { $gte : new ISODate("2012-01-12T20:15:31Z") } } 
     } 
    } 
    }, 
    { 
    multi: true, 
    } 
) 

遺憾的是,沒有運氣:(我還試圖用$datenew Date。 - 仍然沒有效果,而$elemMatch它會刪除所有的事件這不是我想要的

我想。只刪除所述第一和第三元件(僅與timestamp域元素)

+0

我想刪除就在第一和第三個元素(只時間戳字段元素) – ambi

回答

1

您的目標是你查詢了錯誤的領域,如果你想確定哪些元素缺少其他字段。

而不是$pull查詢timestamp,它應該檢查該元素需要的任何其他字段丟失。

db.collection.update(
    { }, 
    // Remove all elements that are missing a "type" field 
    { $pull: { events: { type: {$exists: false } } } }, 
    { 
    multi: true, 
    } 
) 
+0

感謝。根據[文檔](https://docs.mongodb.org/v2.6/reference/operator/update/pull/#remove-items-from-an-array-of-documents),'$ elemMatch'仍然不是對我清楚 – ambi

+0

@ambi當您有多個條件檢查每個元素時,您只需要'$ elemMatch'。 – JohnnyHK

+0

嘗試使用兩個文檔創建調查收集,就像在上述文檔中一樣。 'db.survey.update( {}, {$ pull:{results:{$ elemMatch:{score:4,item:「B」}}}}, {multi:true} ) '?我的理解是,它應該從'results'數組中刪除這個元素,它不起作用 – ambi

-1

根據Data Types in the mongo Shell都應該是等效的:

蒙戈殼提供了各種方法,以返回日期,無論是作爲一個字符串或日期對象:返回當前日期作爲一個字符串

  • 日期()方法。
  • new Date()構造函數,它使用ISODate()包裝器返回一個Date對象。
  • ISODate()構造函數,它使用ISODate()包裝器返回一個Date對象。

在此基礎上,你應該改變這一行:

{ timestamp: { $gte : new ISODate("2012-01-12T20:15:31Z") } } 

這樣:

{ timestamp: { $gte : ISODate("2012-01-12T20:15:31Z") } } 
+0

它不工作,要麼 – ambi

相關問題