Я пытаюсь вставить элемент в массив в мангусте. Я делаю это с помощью update и $ push. Но он не обновляет его в базе данных. Это мой код. routes.js:
var Chooser = require('../chooser');
var appRouter = function(app) {
app.put("/chooser/:id", function(req, res) {
console.info("ID: ", req.params.id);
if (!req.body.toFollow) {
return res.send({"status": "error", "message": "The account that you want to follow is needed"});
}
else {
console.info("Cuenta: ", req.body.toFollow);
Chooser.update({_id: req.params.id}, {$push: {accounts: {"name": "foo", "idAccount": 123456}}});
return res.send({"status": "ok"});
}
});
}
Это моя схема мангуста. Chooser.js:
var mongoose = require('mongoose');
var chooserSchema = mongoose.Schema({
_id: Number,
accounts: [{name: String, idAccount: Number}]
}, { _id: false });
var Chooser = mongoose.model('Chooser', chooserSchema);
module.exports = Chooser;
См. stackoverflow.com/questions/14877967/…
Отвечает ли это на ваш вопрос? Array.push, похоже, не работает на MongoDB



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Насколько я знаю, вы должны сделать как показано ниже.
Model.findAndUpdate({_id: 'your_id'},
{$push: {'your_array_field':
{"name": "foo","idAccount": 123456}}},
{new: true}, (err, result) => {
// Rest of the action goes here
})
Мы делаем это таким образом - мы добавляем еще одну модель, но в вашем случае вы просто добавляете массив, поэтому поместите его в переменную вместо req.body.resource ..
Также вы можете просто использовать findByIdAndUpdate, а не Async, если не хотите.
вот модельный элемент:
resources: [{type: mongoose.Schema.Types.ObjectId, ref: 'Resource'}],
вот метод добавления элемента в массив:
//AddResource to a crew
export function addResource(req, res) {
if (req.body._id) {
delete req.body._id;
}
Crew.findByIdAndUpdateAsync(req.params.id,
{
$push: { "resources": req.body.resource }
},
{ safe: true, upsert: true },
function (err, model) {
if (err) {
//console.info(err);
return res.send(err);
}
return res.json(model);
});
и удалить:
//deleteResource to a crew
export function deleteResource(req, res) {
if (req.body._id) {
delete req.body._id;
}
// console.info(req.body.resource);
Crew.findByIdAndUpdateAsync(req.params.id,
{
$pullAll: { "resources": req.body.resource }
},
function (err, model) {
// console.info(model);
if (err) {
//console.info(err);
return res.send(err);
}
return res.json(model);
});
Мы можем это сделать
Model.findOneAndUpdate({"_id":req.body.id},{
"$push": {"resources": req.body.resources}
},{new: true, safe: true, upsert: true }).then((result) => {
return res.status(201).json({
status: "Success",
message: "Resources Are Created Successfully",
data: result
});
}).catch((error) => {
return res.status(500).json({
status: "Failed",
message: "Database Error",
data: error
});
});`
Вот как вы можете обновить модель в мангусте (используя асинхронное ожидание):
let updatedModel = await Model.findByIdAndUpdate(req.params.id,
{ $push: { accounts:{"name": "foo", "idAccount": 123456} } },
{ 'upsert': true });
или в вашем коде
Возможно, вы пропустили {new: true, upsert: true}, если хотите, чтобы обновленный документ был возвращен вам.
Chooser.update({_id: req.params.id}, {$push: {accounts: {"name": "foo", "idAccount": 123456}}},{new: true, upsert: true });
"Cuenta" входит в консоль? Кроме того, разве вы не хотите res.send после .update, то есть в функции обратного вызова обновления?