2016-08-01 2 views
1

Я пытаюсь найти определенный идентификатор в моем документе, а затем объединить массив к существующему, например, если я этот массив хранится в 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