Нажмите элементы в массив монго через Мангуст


я рыскал так хорошо ищет ответ, но я уверен, что я потерял правильные слова, чтобы описать то, что я после.

в основном у меня есть коллекция 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 61

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);