Mongoose findByIdAndUpdate / findById返回null作为模型

时间:2015-07-02 18:21:00

标签: node.js mongodb backbone.js mongoose

在我的节点应用中,在后端使用mongoose,在前端使用主干:

console.log(typeof elementid, elementid); //string 559578bb66e931bc11c02214

try {

    myModel.findByIdAndUpdate(elementid, {marked: true}, {upsert: false, new: true}, function (err, doc) {

        console.log(err); //null
        console.log(doc); //null

    });

} catch (error) {
    console.log(error); //not executed
}

数据库中的文件:

{
    "_id" : ObjectId("559578bb66e931bc11c02214"),
    "marked" : false,
    //..more stuff here...
}

此文档的架构:

myModelSchema = mongoose.Schema({
    "marked": Boolean,
    //more stuff here...
});

findById()也不会返回任何文件。

但我可以在mongodb中发出搜索并找到该文件:

  

db.getCollection(' mymodels')。find({' _id&#39 ;: ObjectId(' 559578bb66e931bc11c02214')})

我认为它是因为id不是字符串而是用ObjectId()表示? 首次创建文档时,ObjectIds由mongoose自己创建。所以我不明白为什么我不能通过_id来查询和查找文档。

更新

我将upsert设置为true。现在,在数据库中创建了一个新文档,如下所示:

  

{       " _id" :" 559578bb66e931bc11c02214",       "标记" :true}

id不会被强制转换为ObjectId。可能是什么原因? 它在我的另一个使用相同模式和数据库设置的脚本中工作......

解决方案:

var ObjectId = require('mongoose').Types.ObjectId;
var elementid = new ObjectId(elementid);
var query = {_id: elementid};
app.uiElement.findOneAndUpdate(query, {marked: true}, {upsert: false, new: true}, function (err, doc) {
    console.log(doc); //works now
});

如果您知道为什么我必须在这种情况下将_id明确地转换为Object _id,请告诉我。 开车送我坚果,我浪费了几个小时。 正如我所说,在另一个使用相同mongoose配置的脚本中,我不需要转换_id。

0 个答案:

没有答案