【问题标题】:Mongoose: why is $addtoset adding incorrect ObjectIdMongoose:为什么 $addtoset 添加不正确的 ObjectId
【发布时间】:2015-06-08 17:10:27
【问题描述】:

我正在尝试使用 mongoose 将项目添加到 ObjectId 的数组中 - 我使用 $addtoset 是因为我只希望在项目不存在时添加它。

但是,我的行为很奇怪。 $addtoset 将 objectId 附加到数组中,但它不是我传递给它的那个。

我已经从我的代码中删除了所有其他内容以尝试缩小范围,现在方法如下所示,它仍然在发生。

userSchema.statics.addPlaylistToUser = function(user, playlistId, done){

    var toss =  playlistId.toString(); //I verify at this point the playlistId is correct, eg. ObjectId("53cf855ac551004417e54da2") 

    User.findByIdAndUpdate(
        user._id,
        {$addToSet: {playlists: playlistId } },
        {safe: true, upsert: false},
        function(err, model) {
//at this point, an object Id has been added to the array, but it is not the same as verified above, the objectid added is eg. ObjectId("53cf8572c551004417e54da4")
                done(err, model);
        })
    }

有趣的是,ObjectId 始终几乎相同,这表明新 id 是在我实际添加的 ID 之后立即生成的。上面的示例 objectid 是运行代码的实际示例。

这个方法在回调中被一个方法调用,该方法实际上生成了我试图添加的 ObjectId ...我的问题可能与此有关吗?

任何关于为什么会发生这种情况的帮助/想法将不胜感激。

我在 SO 上找到了 this similar question,但他们的解决方案似乎非常适合他们的情况,我无法从那里的答案中得到任何想法......

【问题讨论】:

  • 我正在尝试重新创建您的问题,就我而言,它总是可以正常工作。是否还有其他可能导致这种行为的事情发生。你不会在任何地方错误地调用一个函数两次吗?
  • 可能是字符串 vs ObjectId 的情况?

标签: node.js mongodb mongoose


【解决方案1】:

根据 API 文档,选项字段中的属性 'new' 需要为 true 才能返回修改后的文档。否则,默认返回原始文档。

http://mongoosejs.com/docs/api.html#model_Model.findByIdAndUpdate

【讨论】:

    猜你喜欢
    • 2016-11-04
    • 2018-02-13
    • 2021-11-04
    • 1970-01-01
    • 2019-02-14
    • 2021-08-27
    • 2020-09-26
    • 2017-01-08
    • 2022-07-19
    相关资源
    最近更新 更多