Node.js 如何在mongoose中使用更新查询更新文档?
这是我的帖子模型中的注释密钥对:Node.js 如何在mongoose中使用更新查询更新文档?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,这是我的帖子模型中的注释密钥对: const mongoose = require('mongoose'); const Schema = mongoose.Schema; const postSchema = new Schema({ user:{ type:Schema.Types.ObjectId, // required:true, refPath:'onModel' }, onModel:{ type:String, enum:['Doctor'
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const postSchema = new Schema({
user:{
type:Schema.Types.ObjectId,
// required:true,
refPath:'onModel'
},
onModel:{
type:String,
enum:['Doctor','Patient']
},
text:{
type:String,
required:true
},
comments:[{
user:{
type:Schema.Types.ObjectId,
refPath:'onModel'
},
reply:{
type:String
},
date:{
type:Date,
default:Date.now
}
}],
likes:[{
user: {
type: Schema.Types.ObjectId,
ref: 'Patient'
}
}]
})
module.exports= post = mongoose.model('post', postSchema);
当我尝试通过运行以下代码将对象推送到likes数组时,它失败了。过滤器部分工作正常,只是更新部分出现了一些问题,最终执行catch块
Post.updateOne({ _id: req.params.postid, "likes": { $ne : { user:
authorizedData.jwt_payload.patient._id }}},
{ "$set" : { "likes.$.user": "authorizedData.jwt_payload.patient._id"
}})
.then(re => res.json(re))
.catch(err => res.json("already liked"))
非常感谢您的帮助。尝试使用
$push
聚合,该聚合用于将对象推送到mongoDB中的内部数组。您的更新查询应该如下所示:
Post.updateOne({ _id: req.params.postid, "likes": { $ne : { user:
authorizedData.jwt_payload.patient._id }}},
{ "$push" : { "likes": authorizedData.jwt_payload.patient._id
}})
.then(re => res.json(re))
.catch(err => res.json("already liked"))
尝试使用
$push
聚合,该聚合用于将对象推送到mongoDB中的内部数组。您的更新查询应该如下所示:
Post.updateOne({ _id: req.params.postid, "likes": { $ne : { user:
authorizedData.jwt_payload.patient._id }}},
{ "$push" : { "likes": authorizedData.jwt_payload.patient._id
}})
.then(re => res.json(re))
.catch(err => res.json("already liked"))
请进行以下更改:
const mongoose = require('mongoose');
const patientObjectID = mongoose.Types.ObjectId(authorizedData.jwt_payload.patient._id);
Post.updateOne({
_id: req.params.postid,
'likes.user': {
$ne:
patientObjectID
}
},
{ $push: { likes: { user: patientObjectID } }
}).then(re => res.json(re)).catch(err => res.json("already liked"))
需要做几项更改,因此当您有这样一个模式时:
likes: [{
user: {
type: Schema.Types.ObjectId,
ref: 'Patient'
}
}]
$set
用于
更新文档中的现有字段或插入新字段,但当您要推送
将新值添加到文档中的数组字段,然后需要使用
$push
(这似乎是对字段的正常更新操作,但这里我们并没有替换likes数组,而只是向其中添加了一些元素-尽管是不同类型的更新,所以我们需要使用$push
)$push
假设我们正在推送的内容不是重复的,但以另一种方式,您可以盲目使用来执行相同的操作,而不必使用下面的筛选条件:
"likes": {
$ne: {
user:
patientObjectID
}
}
likes
数组中的现有元素中。然后(re=>res.json(re))
您需要检查更新操作的写入结果,如果任何更新都需要发送添加的用户,如果不需要,您需要发送“已经喜欢的”希望这能解决您的所有问题:-)请进行以下更改:
const mongoose = require('mongoose');
const patientObjectID = mongoose.Types.ObjectId(authorizedData.jwt_payload.patient._id);
Post.updateOne({
_id: req.params.postid,
'likes.user': {
$ne:
patientObjectID
}
},
{ $push: { likes: { user: patientObjectID } }
}).then(re => res.json(re)).catch(err => res.json("already liked"))
需要做几项更改,因此当您有这样一个模式时:
likes: [{
user: {
type: Schema.Types.ObjectId,
ref: 'Patient'
}
}]
$set
用于
更新文档中的现有字段或插入新字段,但当您要推送
将新值添加到文档中的数组字段,然后需要使用
$push
(这似乎是对字段的正常更新操作,但这里我们并没有替换likes数组,而只是向其中添加了一些元素-尽管是不同类型的更新,所以我们需要使用$push
)$push
假设我们正在推送的内容不是重复的,但以另一种方式,您可以盲目使用来执行相同的操作,而不必使用下面的筛选条件:
"likes": {
$ne: {
user:
patientObjectID
}
}
likes
数组中的现有元素中。然后(re=>res.json(re))
您需要检查更新操作的写入结果,如果任何更新都需要发送添加的用户,如果不需要,您需要发送“已经喜欢的”希望这能解决您的所有问题:-)这也不行。当我尝试更新一个字符串字段时,它成功地更新了,但在这里它失败了。这也不起作用。当我尝试更新一个字符串字段时,它更新成功,但在这里失败。使用
$push
,您遇到的错误是什么,您的模式是这样的吗?或者你能给我们更多关于模式的信息吗?当我放置catch块时,我得到的错误是:无法在元素{likes:[]]中创建字段“user”。我不知道这是否与演员阵容有关。我也编辑了上面的模式,请允许我也尝试过使用{$push:{“likes.$.user”:authorizedData.jwt\u payload.patient.\u id}。还有{$push:{“likes.user”:authorizedData.jwt_payload.patient.\u id}}和最后{$push:{likes:{user:authorizedData.jwt_payload.patient.\u id}}。但是似乎没有什么需要改进的,你能给我们一个你喜欢数组的示例文档吗,这样就很容易对模式的修改提出建议。是的,它现在可以使用你说的语法:{$push:{likes:{user:authorizedData.jwt_payload.patient.\u id}}。非常感谢你。但是您仍然可以解释为什么我们不能使用语法:{$push:{“likes.$.user”:authorizedData.jwt\u payload.patient.\u id}。奇怪的是,我们在哪里可以使用这种语法,那么使用$push
时会出现什么错误,您的模式是这样的吗?或者你能给我们更多关于模式的信息吗?当我放置catch块时,我得到的错误是:无法在元素{likes:[]]中创建字段“user”。我不知道这是否与演员阵容有关。我也编辑了上面的模式,请允许我也尝试过使用{$push:{“likes.$.user”:authorizedData.jwt\u payload.patient.\u id}。还有{$push:{“likes.user”:authorizedData.jwt_payload.patient.\u id}}和最后{$push:{likes:{user:authorizedData.jwt_payload.patient.\u id}}。但似乎什么都没做似乎你们的模式需要一个小的改变,你们能给我们一个你们喜欢数组的示例文档吗,这样就很容易对模式提出建议了