Intereting Posts
Галерея изображений с надписью с использованием CloudinaryImage на keystonejs Ошибка JSON при parsingе «… не имеет метода« replace » MongoDB Query с несколькими условиями и срезом Функция обратного вызова, которая никогда не вызывается после выполнения запроса Mongoose Socket.io отключает клиент по идентификатору fs.createReadStream () эквивалент для удаленного файла в узле Правильный способ обработки обещаний и ответа сервера JsHint бросает ошибку «Идентификатор, ожидаемый после токена» В node.js, как объявить общую переменную, которая может быть инициализирована мастер-процессом и доступна для рабочих процессов? Visual Studio Task Runner Explorer Extension не распознает gulpfile.js npm считает узел устаревшим, но это не Экспресс-обработка URIError: не удалось декодировать параметр Как обновить объект сеанса req.user, заданный паспортными данными? Слишком длинный путь из-за зависимостей вложенных узлов Стоит ли идиоматическое программирование? Пример ES6

Возвратите обновленную коллекцию с Mongoose

Я работаю с nodejs / express / mongoose / angularjs. Я хотел бы обновить коллекцию с именем «Списки», которая имеет несколько свойств, один из которых представляет собой массив элементов. В следующем коде я нажимаю новые элементы задачи в массиве items. Все работает нормально, однако функция обновления не отправляет обновленную коллекцию, тогда я должен выполнить другой запрос в базе данных. Есть ли более эффективный способ сделать это?

Код nodejs / express:

exports.addTaskToList = function(req, res) { var listId = req.params.Id; var taskId = req.params.TaskId; Lists.update({_id: listId}, {$push: {items: taskId}}, {safe:true, upsert: true}, function(err, result){ if(err) { console.log('Error updating todo list. ' + err); } else{ console.log(result + ' todo list entry updated - New task added'); Lists.findById(listId).populate('items').exec(function (err, updatedEntry) { if (err) { console.log('Unable to retrieve todo list entry.'); } res.send(JSON.stringify(updatedEntry)); }); } }); }; 

Кроме того, элементы массива представляют собой массив ObjectIds. Эти элементы находятся в отдельной схеме, поэтому в отдельной коллекции. Можно ли протолкнуть весь объект, а не только его _id, чтобы не создавалась другая коллекция?

Метод обновления не возвращает обновленный документ:

Однако, если нам не нужен документ, возвращенный в нашем приложении, и мы хотим просто обновить свойство в базе данных напрямую, обновление Model # подходит для нас.

Если вам необходимо обновить и вернуть документ, рассмотрите один из следующих вариантов:

Традиционный подход:

 Lists.findById(listId, function(err, list) { if (err) { ... } else { list.items.push(taskId) list.save(function(err, list) { ... }); } }); 

Более короткий подход:

 Lists.findByIdAndUpdate(listId, {$push: {items: taskId}}, function(err, list) { ... }); 

используйте метод findOneAndUpdate () и в опции использования параметра запроса как {“new”: true}

 return this.sessionModel .findOneAndUpdate({user_id: data.user_id}, {$set:{session_id: suuid}}, { "new": true}) .exec() .then(data=>{ return { sid: data.session_id } }) 

Что касается вашего последнего вопроса:

Можно ли протолкнуть весь объект, а не только его _id, чтобы не создавалась другая коллекция?

Ответ – да. Вы можете хранить субдокументы в документах довольно легко с помощью Mongoose ( документация по поддоменам здесь ). Изменив свою схему немного, вы можете просто нажать весь объект объекта (а не только элемент _id ) в массив элементов, определенных в схеме списка. Но вам нужно будет изменить вашу схему, например:

 var itemSchema = new Schema({ // Your Item schema goes here task: 'string' // For example }); var listSchema = new Schema({ // Your list schema goes here listName: String, // For example... items: [itemSchema] // Finally include an array of items }); 

Добавив объект item к свойству элементов списка, а затем сохраните этот список – ваш новый элемент будет сохранен в коллекции List. Например,

 var list = new List({ listName: "Things to do" }); list.items.push({ task: "Mow the lawn" }); list.save(function(error, result) { if (error) // Handle error console.log(result.list) // Will contain your item instance }); 

Поэтому, когда вы загружаете свой список, свойство items будет заполнено массивом элементов.

Это связано с тем, что элементы больше не будут сохраняться в отдельной коллекции. Он будет сохранен в коллекции списка в качестве поддокумента Список.