猫鼬findbyid()返回null

时间:2018-09-03 10:14:17

标签: node.js mongodb express mongoose

我正在尝试按其ID在mongo数据库中查找记录

无论我使用findbyid(),findone(id,...),它都返回null

这是我的代码。解决办法是什么?

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/Movie', {useNewUrlParser: true})
.then(() => console.log('Connected to Databse'))
.catch(err => console.err('Could not connect to MongoDB', err));

var ObjectId = require('mongodb').ObjectID;

const Schema = new mongoose.Schema({
    name: String,
    author: String,
    tags: [String],
    date: Date, 
    isPublished: Boolean,
    price: Number
});

const Data = mongoose.model('Datas', Schema);

async function updateData(id){
const result = await Data.findById(id);
console.log(result);
}
updateData('5a6900fff467be65019a9001');

5 个答案:

答案 0 :(得分:4)

对此有一个简单的解决方案:

替换

const result = await Data.findById(id);

使用

const result = await Data.findById(id).exec();

有关exec()的功能,请参见Mongoose - What does the exec function do?

答案 1 :(得分:0)

检查您的mongodb数据库,如果_id存储为字符串,则找不到findById(id)。仅id FindById(id)。 您可能使用mongoimport并在JSON中包含finds ObjectId('yourId')来导入数据库,这是错误的,请在导入的JSON中删除_id

答案 2 :(得分:0)

在我的情况下,导入的文件以前将_id列作为字符串,因此它弄乱了数据库,因此我无法使用该列进行过滤。

一旦我删除了集合,从数据文件中删除了_id列并重新导入,_id过滤就可以正常工作了。

答案 3 :(得分:0)

我有同样的问题。我的数据库集合中的_id是String。启用猫鼬调试require('mongoose').set('debug', true)后,我发现猫鼬查询idObjectId("yourId"),除非我们在模式中定义了_id。为了解决该问题,我必须在猫鼬模式中添加_id:String

const MyDataSchema = new Schema({
  _id: String,
...
...
}

答案 4 :(得分:0)

我也遇到了同样的问题。然后我提到了这个 solution 确保集合中的文档将 _id 作为 Object 而不是 String。如果您已使用 JSON 文件导入数据库条目,只需删除所有 _id 字段,然后导入即可。

导入后,MongoDB 会自行为所有条目分配 _id 值。