В ситуации мне нужно обновить поле всех документов, вложенных в массив в модели Mongoose.
Я добавляю новый вложенный документ загруженного изображения в коллекцию пользователей, и мне нужно установить «is_available» всех предыдущих документов как ложное и только поле «is_available» вновь вставленного документа должно быть истинным.
Все, что я искал и нашел, касалось обновления вложенного документа с определенным идентификатором или фильтром. но я не нашел способа обновить конкретное поле всех вложенных документов массива в модели.
Моя модель:
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var UsersSchema = new Schema({
name: { type: String, default: "" },
lastname: { type: String, default: "" },
images: [{
dir: { type: String },
is_available: { type: Boolean }
}]
});
var Users = mongoose.model("Users", UsersSchema, "users");
module.exports = Users;
Фактический результат:
{
"_id" : ObjectId("5ce950aa4sw435ty503ab83b"),
"name" : "Sina",
"image" : [
{
"_id" : ObjectId("5cf4dd3da6b4gb6bcf9c6dc1"),
"dir" : "profiledirectory/804eafeaf8acc40a3d6.jpg",
"is_available" : true
},
{
"_id" : ObjectId("5cf4fffs2419316bddffgg82"),
"dir" : "profiledirectory/d85b01ac40fa6b1a7c1.jpg",
"is_available" : true
},
{
"_id" : ObjectId("5cf4ff334fhd316bef2fdt40"),
"dir" : "profiledirectory/512d9d19da7a4322b37.jpg",
"is_available" : true
}
]
}
Ожидаемый результат:
{
"_id" : ObjectId("5ce950aa4sw435ty503ab83b"),
"name" : "Sina",
"image" : [
{
"_id" : ObjectId("5cf4dd3da6b4gb6bcf9c6dc1"),
"dir" : "profiledirectory/804eafeaf8acc40a3d6.jpg",
"is_available" : false
},
{
"_id" : ObjectId("5cf4fffs2419316bddffgg82"),
"dir" : "profiledirectory/d85b01ac40fa6b1a7c1.jpg",
"is_available" : false
},
{
"_id" : ObjectId("5cf4ff334fhd316bef2fdt40"),
"dir" : "profiledirectory/512d9d19da7a4322b37.jpg",
"is_available" : true
}
]
}
Code Snippet:
let updateQuery = {
$set: { 'image.$.is_available': false },
$push: {
image: [
{
dir: "profiledirectory/558bb6938ecd54bde556af122a4.jpg",
is_available: true
}
]
}
}
let findQuery = { _id: req.body.user_id }
Users.findOneAndUpdate(findQuery,
updateQuery, function (err, doc) {
if (err) {
res.send(err.message)
} else {
res.send('successful')
}
})