2015-05-27 3 views
1

Использование: MongoDB и собственный драйвер nodeJS mongoDB.MongoDB, NodeJS: обновление встроенного документа с новыми членами

Я пытаюсь разобрать все данные из графика fb api, отправить его в свой API и затем сохранить его в моей БД.

обработки в моем сервере PUT:

//Update user's data 
app.put('/api/users/:fbuser_id/:category', function(req, res) { 
    var body = JSON.stringify(req.body); 
    var rep = /"data":/; 
    body = body.replace(rep, '"' + req.params.category + '"' + ':'); 
    req.body = JSON.parse(body); 
    db.fbusers.update({ 
      id: req.params.fbuser_id 
     }, { 
      $set: req.body 
     }, { 
      safe: true, 
      multi: false 
     }, 
     function(e, result) { 
      if (e) return next(e) 
      res.send((result === 1) ? { 
       msg: 'success' 
      } : { 
       msg: 'error' 
      }) 
     }); 
}); 

Я посылаю в то время, 25 элементов, и этот код просто переопределяет вместо обновления документа.

данных Я посылаю к API:

{ 
    "data": [ 
    { 
     "category": "App page", 
     "name": "SoundCloud", 
     "id": "7919071058", 
     "created_time": "2013-09-16T18:16:59+0000" 
    }, 
    { 
     ...and so on 
    } 
    ] 
    } 

В основном мои изменения API "данных" ключ от посланного JSON на название категории, Fe: PUT к/API/пользователей/000/любит будет измените ключ «данные» на «любит»:

{ 
    "likes": [ 
    { 
     "category": "App page", 
     "name": "SoundCloud", 
     "id": "7919071058", 
     "created_time": "2013-09-16T18:16:59+0000" 
    }, 
    { 
     ...and so on 
    } 
    ] 
    } 

Затем этот JSON помещается в отсек.

Иерархия в MongoDB:

 { 
     "_id": ObjectID("556584c8e908f0042836edce"), 
     "id": "0000000000000", 
     "email": "[email protected]", 
     "first_name": "XXXXXXXX", 
     "gender": "male", 
     "last_name": "XXXXXXXXXX", 
     "link": "https://www.facebook.com/app_scoped_user_id/0000000000000/", 
     "locale": "en_US", 
     "name": "XXXXXXXXXX XXXXXXXXXX", 
     "timezone": 3, 
     "updated_time": "2015-05-26T18:11:59+0000", 
     "verified": true, 
     "likes": [ 
      { 
       "category": "App page", 
       "name": "SoundCloud", 
       "id": "7919071058", 
       "created_time": "2013-09-16T18:16:59+0000" 
      }, 
      { 
       "category": "App page", 
       "name": "SoundCloud", 
       "id": "7919071058", 
       "created_time": "2013-09-16T18:16:59+0000" 
      }, 
      { 
       ....and so on 
      } 
      ] 
     } 

Таким образом, проблема в том, что мой апи перекрывает поле (в данном случае «любит») с недавно переданных данных, а не добавляя его в уже существующий документ с данными.

Я уверен, что я должен использовать другой параметр, чем «$ put» в обновлении, однако я понятия не имею, какой из них и как передать параметры программно.

+0

Вы пробовали с толчком? http://docs.mongodb.org/manual/reference/operator/update/push/ – Antonio

+0

Да, однако мне нужно передавать ключи и значения программно. Несмотря на то, что сервер работает - я получаю сбои, когда данные отправляются в обработчик маршрута PUT. Существует высокая вероятность того, что он падает из-за моей ошибки хе. Таким образом, я хотел бы посмотреть, как другие люди подходят к этой проблеме – gedasp

ответ

0

Используйте $push with the $each modifier для добавления нескольких значений в поле массива.

var newLikes = [ 
    {/* new item here */}, 
    {/* new item here */}, 
    {/* new item here */}, 
]; 

db.fbusers.update(
    { _id: req.params.fbuser_id }, 
    { $push: { likes: { $each: newLikes } } } 
); 

Смотрите также оператор $addToSet, он добавляет значение в массив, если значение не уже присутствует, в этом случае $ addToSet ничего не делает для этого массива.