2014-11-21 63 views
0

這是我的文檔的一個示例。如何將兩個鍵組合成Mongodb中的一個新對象?

{ 
    _id: '1', 
    card: [ 
     { 
      'expiration_month': '10', 
      'expiration_year': '2017' 
     }, 
     { 
      'expiration_month': '01', 
      'expiration_year': '2015' 
     }, 
    ] 
} 

我想年份和月份合併成一個約會對象並將其存儲在這些密鑰已經存儲在同一個對象。

所以它應該是這樣的,其中expires實際上是一個日期目的。

{ 
    _id: '1', 
    card: [ 
     { 
      'expiration_month': '10', 
      'expiration_year': '2017', 
      expires: {     
      } 
     }, 
     { 
      'expiration_month': '01', 
      'expiration_year': '2015', 
      expires: {     
      } 
     } 
    ] 
} 

我試過這個,但我知道這是錯誤的。

db.collection.update({'card.expires': {$exists: false}}, { $set: moment(new Date(card.expiration_year + '-' + card.expiration_month)) })

+0

我們不能構建一個vaild Date對象沒有'month',一個'年'和'日期'。 – BatScream 2014-11-21 21:58:47

+0

好的,我實際上使用了momentjs,但是我從示例中刪除了這個,因爲我不想讓這個問題複雜化。看起來它有相反的效果。我把它放回我的例子中。謝謝 – JoshJoe 2014-11-21 22:00:42

回答

0

我會做這樣的:

更新 card數組元素將是
db.yourcollection.find().snapshot().forEach(
    function (e) { 
    var saveChanges = false; 

    if(e.cards && e.cards.length > 0){ 
     for(var i=0; i < e.cards.length; i++){ 
      if(e.cards[i].expiration_month && e.cards[i].expiration_year){ 
       e.cards[i].expires = new Date(e.cards[i].expiration_year, e.cards[i].expiration_month, 1); 

       saveChanges = true; 
      } 
     } 
    } 
    if(saveChanges) db.yourcollection.save(e); 
    } 
) 
+0

謝謝,我會盡快嘗試 – JoshJoe 2014-11-21 22:11:26

+0

除了'''new Date(e.cards [i] .expiration_year,e.cards [i] .expiration_month,1);'''實際上返回似乎是錯誤的日期。對於expiration_year = 2015年和expiration_month = 12它返回'''2016-01-01 06:00:00 00.000Z''' – JoshJoe 2014-11-21 22:43:41

+0

在那種情況下只是谷歌周圍如何處理這種類型的轉換JS日期,現在你有價值,並可以保存它們會更容易 – 2014-11-21 23:59:53

0

可悲的是MongoDB中不允許基於關閉文檔中的字段的更新。 https://jira.mongodb.org/browse/SERVER-458

您需要將其作爲兩個單獨的操作,一個找到要修改的文檔,另一個用正確的新日期更新這些文檔。

+0

好的,我可以做一個查找,然後遍歷遊標並更新這種方式? – JoshJoe 2014-11-21 22:02:18

0

方式一:

db.collection.find({"card.expires":{$exists:false}}).forEach(function(doc){ 
var cards = doc.card.map(function(card){ 
var date = new ISODate(card.expiration_year+card.expiration_month+"01"); 
if(!card.hasOwnProperty("expires")){card["expires"]=date;} 
return card; 
}) 
db.collection.update({"_id":doc._id},{"card":cards}); 
}); 
相關問題