2016-08-01 75 views
1

我想我的文檔中找到一個特定的ID,然後,如果我已經存儲在db.friends這個數組合並數組現有之一,例如:的MongoDB:我如何才能找到和合並陣列

["12","13","14"] 

我送這個數組:["12","16","18"],db.friends應包含以下內容:["12","13","14","16","18"]

我使用下劃線庫,但我不知道我要

(在貓鼬也許「聚集」?)

這是我做的,你能告訴我我在哪裏錯了嗎?

function saveFollowers(req, res) { 
var friends = req.body.friends; // the new array to merge ["54aafe9df4ee360300fc94c7"]; 

User.findOne({_id: req.user._id}).exec(function (err, user) { 
     if (err) { 
      res.jsonp({error: "Error fetching user info"}) 
     } else { 
     friends = _.extend(friends, user.friends); //user.friends=existing friends we have in db 
     user.save(function (err) { 
      if (err) { res.jsonp({error: "Cant save"}); } 
      console.log("Friends NOW:"+JSON.stringify(friends)); //Here I don't see the merge, also, I can't see it in mongo db. 
      res.jsonp("success"); 
     }); 
     } 
    }); 

謝謝!

回答

0

使用您當前的實現,您並未實際修改返回的用戶對象中的朋友密鑰。因此,而可以使用union方法

user.friends = _.union(friends, user.friends); //user.friends=existing friends   
user.save(function (err) { .. } 

或用ES6使用spread operator用於級聯用於產生一組不同的元件的陣列和Set

user.friends = [...new Set([...friends ,...user.friends])]; 
user.save(function (err) { .. } 

另一種替代方法是使用匯總框架,您可以利用$setUnion運營商:

function saveFollowers(req, res) { 
    var friends = req.body.friends; // the new array to merge ["54aafe9df4ee360300fc94c7"]; 

    User.aggregate([ 
     { "$match": { _id: req.user._id } }, 
     { 
      "$project": { 
       "friends": { "$setUnion": [ "$friends", friends ] }    
      } 
     } 
    ]).exec(function (err, results){ 
     if (err) { 
      res.jsonp({error: "Error fetching user info"}) 
     } else { 
      User.findByIdAndUpdate(req.user._id, 
       { "$set": { "friends": results[0].friends } }, 
       { "new": true }, 
       function (err, user) { 
        if (err) { res.jsonp({error: "Cant save"}); } 
        console.log("Friends NOW: "+ JSON.stringify(user.friends)); 
        res.jsonp("success"); 
       } 
      ); 
     } 
    }); 
} 
+1

謝謝你chridam,你讓我的一天! (我用你的第二個功能,它只是工作).. :) – EranLevi