Нажимайте элементы в массив 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}});
};
Ответы
Ответ 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);