node.js - 在猫鼬快递中更新子文档数组
问题描述
所以我有一个模式,就像这样:
const playerSchema = new Schema(
{
user: {
type: Schema.Types.ObjectId,
ref: 'user'
},
paid : {type: Boolean, default: false}
}
)
const tournamentSchema = new Schema(
{
name: {
type: String,
required: true
},
player:[ playerSchema])
所以在锦标赛模型中我得到这个作为回报:
{
"_id": "5fbf3afe1ecd92296c746db6",
"name": "1st Testing Tournament",
"player": [
{
"paid": false,
"_id": "5fbf3cfe6347784028da8181",
"user": "5fbf3b4c1ecd92296c746dcd"
}
]}
在 API 中,我将只有用户 ID 和锦标赛 ID。我想将数组从假更新为真paid
。players
这是我尝试过的:
exports.put_confirmPayment= async(req, res)=>{
const uid = req.params.user_id
const tid = req.params.tid
const findData= {"_id": tid, "player.user": uid }
const changeData = {"player.$.paid": "true"}
try {
await Tournament.findOneAndUpdate( findData, {$set: {changeData}} )
const tDB = await Tournament.findById(tid)
res.status(200).json(tDB)
} catch (error) {
console.log(error)
res.status(500).json(error.message)
}
}
我哪里错了?我的方法应该是什么?
解决方案
- 使用将字符串 id 从字符串转换为对象类型
mongoose.Types.ObjectId
- 将“true”字符串更改为布尔值 true
- 使用 返回更新的结果
returnOriginal: false
,或者new: true
两者都将返回新的更新结果 - 移除了额外的常量变量,不要创建太多变量
exports.put_confirmPayment = async(req, res) => {
try {
const tDB = await Tournament.findOneAndUpdate(
{
_id: mongoose.Types.ObjectId(req.params.tid),
"player.user": mongoose.Types.ObjectId(req.params.user_id)
},
{ $set: { "player.$.paid": true } },
{ returnOriginal: false }
);
res.status(200).json(tDB);
} catch (error) {
console.log(error);
res.status(500).json(error.message);
}
}
有关更多信息,请参阅mongoose findoneandupdate文档。
推荐阅读
- amazon-web-services - AWS 代码构建(Windows 映像)Tcp 端口被阻止
- gradle - Spring Boot 中的远程 Jacoco 代理不生成报告
- angularjs - angularjs 指令到 angular6 组件/指令
- php - 更改分叉项目中的 PHP 命名空间?以及如何在没有 PHP 命名空间的情况下打开拉取请求?
- javascript - 从元素的文本中获取整数
- mysql - 枚举从显示表中检索到的结果
- java - 获取 sbt 插件时“PKIX 路径构建失败”和“无法找到请求目标的有效认证路径”
- c# - 如何通过另一个 DLL(托管)自动代理一个 DLL(托管)?
- javascript - Javascript document.querySelectorAll() 不适用于无限滚动
- cuda - 如何在 Windows 上配置 Dev-cpp 以运行 CUDA?