2014-11-07 72 views
0

我有一個集合,它顯示了用戶最喜歡的電影列表。 下面是一個簡單的數據集...findAndModify在node.js/MongoDb中的用法

{ 
     "_id" : ObjectId("545c08dcc4d2b8a0243dd4db"), 
     "mail" : "[email protected]", 
     "name" : "Mickey Mouse", 
     "favorite_movies" : [ 
       { 
         "name" : "The Green Mile", 
         "Year" : "1992" 
       }, 
       { 
         "name" : "Raging Bull", 
         "Year" : "1980" 
       } 
     ], 
     "watched_movies" : [ 
       { 
         "name" : "The Green Mile", 
         "Year" : "1992" 
       }, 
       { 
         "name" : "Jaws", 
         "Year" : "1976" 
       }    
     ] 
} 

現在_id 545c08dcc4d2b8a0243dd4db給出一個電影

{ 
    "name" : "InterStellar", 
    "Year" : "2014" 
} 

,如果我需要把它添加到watched_movies,在Node.js的/ MongoDB中,我相信唯一的辦法是

  1. 使用查找
  2. 做一個findAndModify上找到的文件通過附加查找文檔到watched_movies數組。

第2步是基於例如這裏 http://mongodb.github.io/node-mongodb-native/markdown-docs/insert.html

有沒有更好的方式來做到這一點?特別是我可以避免步驟#1?

這是我如何做第二步。 但我不得不執行步驟#1獲得「watched_movies」元素,然後追加新的電影將它構建movielist

//try to update 
collection.findAndModify(
{'_id':new BSON.ObjectID(id)}, //query 
[['_id','asc']], //sort order 
{$set: {"watched_movies": movielist}}, //replacement 
{new: true}, //options 
function(err, newObject){ 
    if(err) { 
    console.warn(err.message); 
    } else { 
    console.log("Updated !! " + JSON.stringify(newObject)); 
    res.send(object); 
    } 
}); 

我也願意就改進這一模式設計的建議。

回答

0

您可以用單一findAnyModify呼叫是通過使用$push$addToSet數組運算符做到這一點,直接新的電影添加到watched_movies陣列:

var movie = { 
    "name" : "InterStellar", 
    "Year" : "2014" 
}; 

collection.findAndModify(
    {'_id':new BSON.ObjectID(id)}, 
    [['_id','asc']], 
    {$addToSet: {"watched_movies": movie}}, 
    {new: true}, 
    function(err, newObject){ 
    if(err) { 
     console.warn(err.message); 
    } else { 
     console.log("Updated !! " + JSON.stringify(newObject)); 
     res.send(newObject); 
    } 
    }); 
+0

感謝你的小費! $ addToSet很棒。但這不起作用findAndModify.I得到這個錯誤「異常:nextsafe():{$ err:」can not canonical query:badvalue Code:17287.但它適用於collection.update(),雖然它不' t返回更新的文檔。 – EnnioMorricone 2014-11-07 03:30:33

+0

@EnnioMorricone我把排序參數回來,現在它測試了很好現在。我沒有意識到這一直是必需的。 – JohnnyHK 2014-11-07 03:41:52