Нажмите элементы в массив монго через Мангуст
я рыскал так хорошо ищет ответ, но я уверен, что я потерял правильные слова, чтобы описать то, что я после.
в основном у меня есть коллекция mongodb под названием "Люди" Схемы для этой коллекции выглядит следующим образом:
people: {
name: String,
friends: [{firstName: String, lastName: String}]
}
теперь у меня есть очень простое экспресс-приложение, которое подключается к базе данных и успешно создает "людей" с пустым массивом друзей.
на втором месте в заявке находится форма добавлять друзей. Форма принимает firstName и lastName, а затем публикует с полем name также для ссылки на соответствующий объект people.
то, что мне трудно сделать, это создать новый объект друга, а затем "толкать" его в массив друзей.
Я знаю, что когда я делаю это через консоль mongo, я использую функцию обновления с $push в качестве второго аргумента после критериев поиска, но я не могу найти подходящий способ заставить мангуста сделать этот.
db.people.update({name: "John"}, {$push: {friends: {firstName: "Harry", lastName: "Potter"}}});
обновление: Итак, ответ Адриана был очень полезен. Вот что я сделал, чтобы достичь своей цели.
в моем приложении.JS файл, я установил временный маршрут с помощью
app.get('/addfriend', users.addFriend);
где в моих пользователей.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}});
};
3 ответа:
предполагая,
var friend = { firstName: 'Harry', lastName: 'Potter' };
у вас есть два варианта:
обновите модель в памяти и сохраните (простой массив javascript.push):
person.friends.push(friend); person.save(done);
или
PersonModel.update( { _id: person._id }, { $push: { friends: friend } }, done );
Я всегда стараюсь использовать первый вариант, когда это возможно, потому что он будет уважать больше преимуществ, которые дает вам Мангуст (крючки, проверка и т. д.).
однако, если вы делаете много параллельных записей, вы попадете в условия гонки, где вы в конечном итоге неприятные ошибки версии, чтобы остановить вас от замены всей модели каждый раз и потерять предыдущий друг, который вы добавили. Поэтому переходите к последнему только тогда, когда это абсолютно необходимо.
The $push оператор добавляет указанное значение к массиву.
{ $push: { <field1>: <value1>, ... } }
$push добавляет поле массива со значением в качестве ее элемента.
выше ответ выполняет все требования, но я получил его работу, сделав следующее
var objFriends = { fname:"fname",lname:"lname",surname:"surname" }; Friend.findOneAndUpdate( { _id: req.body.id }, { $push: { friends: objFriends } }, function (error, success) { if (error) { console.log(error); } else { console.log(success); } }); )
я столкнулся с этой проблемой, а также. Мое исправление состояло в том, чтобы создать дочернюю схему. Ниже пример для ваших моделей.
---- человек модель
const mongoose = require('mongoose'); const SingleFriend = require('./SingleFriend'); const Schema = mongoose.Schema; const productSchema = new Schema({ friends : [SingleFriend.schema] }); module.exports = mongoose.model('Person', personSchema);
***Важно: SingleFriend.схемы -> убедитесь в том, чтобы использовать строчные схемы
--- детское-схемы
const mongoose = require('mongoose'); const Schema = mongoose.Schema; const SingleFriendSchema = new Schema({ Name: String }); module.exports = mongoose.model('SingleFriend', SingleFriendSchema);