Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在mongoose中使用更新查询更新文档?_Node.js_Mongodb_Mongoose - Fatal编程技术网

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'
    }
}]
  • 您需要将ObjectId()传递给用户字段,而不是字符串,因此 首先,我们将字符串转换为ObjectId()&在查询中传递它

  • 另外,
    $set
    用于 更新文档中的现有字段或插入新字段,但当您要推送 将新值添加到文档中的数组字段,然后需要使用
    $push
    (这似乎是对字段的正常更新操作,但这里我们并没有替换likes数组,而只是向其中添加了一些元素-尽管是不同类型的更新,所以我们需要使用
    $push

  • 由于您已经有了下面的筛选器,我们只是在执行
    $push
    假设我们正在推送的内容不是重复的,但以另一种方式,您可以盲目使用来执行相同的操作,而不必使用下面的筛选条件:

    "likes": {
        $ne: {
            user:
                patientObjectID
        }
    }
    
  • 关于你为什么它不起作用的问题?这应该用于更新数组中的元素,它有助于根据筛选条件更新数组中的第一个匹配元素,但此处要做的是再添加几个元素,但不更新
    likes
    数组中的现有元素

  • 在这里,您不应该在catch块中发送“已经喜欢的”,它应该是实际错误的自定义错误,在
    中。然后(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'
        }
    }]
    
  • 您需要将ObjectId()传递给用户字段,而不是字符串,因此 首先,我们将字符串转换为ObjectId()&在查询中传递它

  • 另外,
    $set
    用于 更新文档中的现有字段或插入新字段,但当您要推送 将新值添加到文档中的数组字段,然后需要使用
    $push
    (这似乎是对字段的正常更新操作,但这里我们并没有替换likes数组,而只是向其中添加了一些元素-尽管是不同类型的更新,所以我们需要使用
    $push

  • 由于您已经有了下面的筛选器,我们只是在执行
    $push
    假设我们正在推送的内容不是重复的,但以另一种方式,您可以盲目使用来执行相同的操作,而不必使用下面的筛选条件:

    "likes": {
        $ne: {
            user:
                patientObjectID
        }
    }
    
  • 关于你为什么它不起作用的问题?这应该用于更新数组中的元素,它有助于根据筛选条件更新数组中的第一个匹配元素,但此处要做的是再添加几个元素,但不更新
    likes
    数组中的现有元素

  • 在这里,您不应该在catch块中发送“已经喜欢的”,它应该是实际错误的自定义错误,在
    中。然后(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}}。但似乎什么都没做似乎你们的模式需要一个小的改变,你们能给我们一个你们喜欢数组的示例文档吗,这样就很容易对模式提出建议了