Подтвердить что ты не робот

Нажимайте элементы в массив mongo через mongoose

Я искал SO, хорошо разбираюсь в ответе, но я уверен, что я потерялся за правильные слова, чтобы описать, что мне нужно.

В основном у меня есть коллекция mongodb, называемая "люди" Схема для этой коллекции выглядит следующим образом:

people: {
         name: String, 
         friends: [{firstName: String, lastName: String}]
        }

Теперь у меня есть очень простой экспресс-приложение, которое подключается к базе данных и успешно создает "людей" с пустым массивом друзей.

В дополнительном месте приложения есть форма для добавления друзей. Форма принимает firstName и lastName, а затем POSTs с полем имени также для ссылки на правильный объект people.

То, что мне сложно делать, это создать новый объект-друга, а затем "подталкивать" его в массив друзей.

Я знаю, что когда я это делаю через консоль mongo, я использую функцию обновления с $push в качестве моего второго аргумента после критериев поиска, но я не могу найти подходящий способ получить mongoose для этого.

db.people.update({name: "John"}, {$push: {friends: {firstName: "Harry", lastName: "Potter"}}});

UPDATE: Итак, ответ Адриана был очень полезен. Следующее - это то, что я сделал для достижения моей цели.

в моем файле 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}});
};
4b9b3361

Ответ 1

Предположим, var friend = { firstName: 'Harry', lastName: 'Potter' };

У вас есть два варианта:

Обновите модель в памяти и сохраните ее (обычный javascript array.push):

person.friends.push(friend);
person.save(done);

или же

PersonModel.update(
    { _id: person._id }, 
    { $push: { friends: friend } },
    done
);

Я всегда стараюсь использовать первый вариант, когда это возможно, потому что он будет учитывать больше преимуществ, которые дает вам mongoose (хуки, проверка и т.д.).

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

Ответ 2

Оператор $ 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);
        }
    });
)

Ответ 3

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

находить:

db.getCollection('noti').find({})

результат для поиска:

{
    "_id" : ObjectId("5bc061f05a4c0511a9252e88"),
    "count" : 1.0,
    "color" : "green",
    "icon" : "circle",
    "graph" : [ 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 2.0
        }
    ],
    "name" : "online visitor",
    "read" : false,
    "date" : ISODate("2018-10-12T08:57:20.853Z"),
    "__v" : 0.0
}

Обновить:

db.getCollection('noti').findOneAndUpdate(
   { _id: ObjectId("5bc061f05a4c0511a9252e88") }, 
   { $push: { 
             graph: {
               "date" : ISODate("2018-10-24T08:55:13.331Z"),
               "count" : 3.0
               }  
           } 
   })

результат для обновления:

{
    "_id" : ObjectId("5bc061f05a4c0511a9252e88"),
    "count" : 1.0,
    "color" : "green",
    "icon" : "circle",
    "graph" : [ 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 2.0
        }, 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 3.0
        }
    ],
    "name" : "online visitor",
    "read" : false,
    "date" : ISODate("2018-10-12T08:57:20.853Z"),
    "__v" : 0.0
}

Ответ 4

Самый простой способ сделать это - использовать следующее:

var John = people.findOne({name: "John"});
John.friends.push({firstName: "Harry", lastName: "Potter"});
John.save();

Ответ 5

Я столкнулся с этой проблемой также. Мое исправление состояло в том, чтобы создать дочернюю схему. Ниже приведен пример для ваших моделей.

---- модель человека

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.schema → убедитесь, что для схемы используется нижний регистр

--- дочерняя схема

const mongoose = require('mongoose');
const Schema   = mongoose.Schema;

const SingleFriendSchema = new Schema({
  Name: String
});

module.exports = mongoose.model('SingleFriend', SingleFriendSchema);