我已经看到有关以下问题的讨论与类似的标题mongoose 'findById' returns null with valid id但我的问题不是数据库名称,因为所有我与同一数据库的其他连接实际上对同一集合的查询工作正常。我使用的是mongoose 4.13.6,节点js 6.11和mongo 3.4。这是一个帖子请求。
var query=req.body;
我发送搜索参数为
var findFruit =
{
_id:query._id
}
当我打印我的findFruit时,我得到:
_id:'5a1cf77920701c1f0aafb85e'
控制器功能是:
Fruit.findById(findFruit._id,function(err,fruit){
if( _.isNull(err) ){
var response = genRes.generateResponse(true,"found successfully");
callback(response);
}
else{
var response = genRes.generateResponse(false,"there occured some error : "+err);
callback(response);
}
})
我甚至试过找
Fruit.find(findFruit,function(err,fruit){
if( _.isNull(err) ){
var response = genRes.generateResponse(true,"found successfully");
callback(response);
}
else{
var response = genRes.generateResponse(false,"there occured some error : "+err);
callback(response);
}
})
该集合肯定有此ID下的条目。
我经历了这个git问题以及https://github.com/Automattic/mongoose/issues/3079不幸的是我不能降级mongoose,因为它可能会影响其他多个工作函数。编辑:我尝试创建ObjectId,如:
var mongoose = require('mongoose');
var ObjectID = require('mongodb').ObjectID;
var objectId = new ObjectID();
// Convert the object id to a hex string
var originalHex = objectId.toHexString();
// Create a new ObjectID using the createFromHexString function
var newObjectId = new ObjectID.createFromHexString(query._id);
模型文件:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;
var FruitSchema = new Schema({
name : {type : String, unique : true},
color : {type : String}
});
module.exports = mongoose.model('Fruit', FruitSchema);
我的所有findById(“id”)调用都返回null。
当用Compass查看集合时,我意识到我的所有_id元素都是字符串。请注意,导入了整个集合。
我在Compass中创建了一个新元素,_id创建为ObjectId!当我用该元素的id调用findById(“id”)时它起作用了!
我的结论是导入显然存在错误。我还没有找到一种方法将字符串_id字段转换为实际集合中的ObjectId。
仍然试图找出为什么findById不适合我,但下面的一段代码做到了
var mongoose = require('mongoose');
var newObjectId=new mongoose.Types.ObjectId(query._id);
var params={
'_id':newObjectId
}
Fruit.find(params).exec(function (err,fruit) {
if( _.isNull(err) ){
var response = genRes.generateResponse(true,"found successfully");
callback(response);
}
else{
var response = genRes.generateResponse(false,"there occured some error : "+err);
callback(response);
}
})
@Shoom。是的,为我工作,谢谢。 findById()需要ObjectID,而不是String。
我没有约束来创建具有特定ID的文档,因此我导入时没有_id。数据库新分配了_id作为ObjectID。
findById(id),(和updateOne({_ id:id},...),按预期开始工作。