javascript - 如何在猫鼬中更新所选文档中数组的所有嵌套文档?
问题描述
在某种情况下,我需要更新嵌套在 Mongoose 模型中的数组中的所有文档的字段。
我将上传图像的新嵌套文档添加到用户集合中,我需要将所有先前文档的“is_available”设置为假,并且只有新插入文档的“is_available”字段为真。
我搜索并发现的只是更新具有特定 id 或过滤器的嵌套文档。但我没有找到一种方法来更新模型中数组的所有嵌套文档的特定字段。
我的模型:
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')
}
})
解决方案
上传文件后,您必须找到用户
// after upload image
User.findOne({_id:req.user._id}).lean().exec((err,user)=>{
if(!err && user){
// setting all previous images to false
user.image.forEach(image=>{
image.is_available=false;
});
// now pushing new uploded item to image array
let newImage={"dir" : "path of uploaded item here" , "is_available" : true};
user.image.push(newImage);
user.save((err,updated)=>{
if(!err && updated){
return res.status(200).json({status:"success",message:"User updated"});
}
});
}
});
推荐阅读
- javascript - how to fix this error it apear when i am going to create react app
- node.js - Cordova connect to node js app in Azure server
- html - 在右侧角落显示 TEXT
- php - storage\logs/laravel.log" could not be opened in append mode: failed to open stream: Permission denied
- python - Webscraping product information using Python and rotating Proxies
- python - Tryind to create custom error response for flask_limiter in a flask restful app
- database-design - 一个基于 Stripe 的非常简单的推荐程序 - 如何隔离付款?
- elasticsearch - 如何从logstash中的时间戳中获取日期?
- swift - Swift:如何构建嵌套评论和回复功能,如 instagram
- php - 使用 Ldap 活动目录的 Laravel 身份验证