在我的节点应用中,在后端使用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。