Я так хорошо искал ответ в поисках ответа, но уверен, что потерян для правильных слов, чтобы описать, что мне нужно.
По сути, у меня есть коллекция mongodb под названием «people». Схема для этой коллекции следующая:
people: {
name: String,
friends: [{firstName: String, lastName: String}]
}
Теперь у меня есть очень простое экспресс-приложение, которое подключается к базе данных и успешно создает «людей» с пустым массивом друзей.
На втором месте в приложении находится форма для добавления друзей. Форма принимает firstName и lastName, а затем POST с полем имени также для ссылки на соответствующий объект people.
Что мне тяжело делать, так это создать новый объект друзей и затем «протолкнуть» его в массив друзей.
Я знаю, что когда я делаю это через консоль Монго, я использую функцию обновления с $ push в качестве второго аргумента после критерия поиска, но я не могу найти подходящий способ заставить Мангуста сделать это.
db.people.update({name: "John"}, {$push: {friends: {firstName: "Harry", lastName: "Potter"}}});
ОБНОВЛЕНИЕ: Итак, ответ Адриана был очень полезным. Вот что я сделал, чтобы достичь своей цели.
В моем файле app.js я установил временный маршрут, используя
app.get('/addfriend', users.addFriend);
где в моем файле users.js у меня есть
exports.addFriend = function (req, res, next)
{
var friend = {"firstName": req.body.fName, "lastName": req.body.lName};
Users.findOneAndUpdate({name: req.user.name}, {$push: {friends: friend}});
};
Ответы:
Предполагая,
var friend = { firstName: 'Harry', lastName: 'Potter' };
У вас есть два варианта:
Обновите модель в памяти и сохраните (обычный javascript array.push):
или
Я всегда стараюсь использовать первый вариант, когда это возможно, потому что он будет учитывать больше преимуществ, которые дает вам mongoose (зацепки, проверка и т. Д.).
Однако, если вы делаете много одновременных записей, вы попадете в условия гонки, в результате чего вы получите неприятные ошибки версии, чтобы помешать вам каждый раз заменять всю модель и терять предыдущего добавленного вами друга. Так что переходите к первому только тогда, когда это абсолютно необходимо.
источник
update
функцию, в то время как это НЕ безопасно найти документ, изменить его в памяти, а затем вызвать.save()
метод на документе. Когда я говорю, что операция «безопасна», это означает, что даже если к документу применяются одно, два или 50 изменений, все они будут успешно применены, и поведение обновлений будет таким, как вы ожидаете. По сути, манипулирование в памяти небезопасно, поскольку вы можете работать с устаревшим документом, поэтому при сохранении изменения, произошедшие после шага выборки, теряются.let done = function(err, result) { // this runs after the mongoose operation }
Выше ответ удовлетворяет всем требованиям, но я получил его, выполнив следующее
источник
Используйте
$push
для обновления документа и вставки нового значения в массив.найти:
результат для поиска:
Обновить:
результат для обновления:
источник
Самый простой способ сделать это - использовать следующее:
источник
В моем случае я сделал это
источник
Я столкнулся с этой проблемой также. Мое исправление состояло в том, чтобы создать дочернюю схему. Ниже приведен пример для ваших моделей.
---- модель человека
*** Важно: SingleFriend.schema -> убедитесь, что для схемы используется нижний регистр
--- дочерняя схема
источник