【问题标题】:Mongoose findbyid() return null猫鼬 findbyid() 返回 null
【发布时间】:2019-02-08 09:16:58
【问题描述】:

我正在尝试通过其 id 在我的 mongo db 中查找记录

无论我使用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');

【问题讨论】:

  • 愚蠢的问题:你 100% 确定数据库中有记录吗?
  • 是的,我确定。我在我的数据库中通过“名称”使用了 findone(),它返回了某事。但不适用于“_id”
  • 您正在传递字符串,而 findById 需要 objectId。尝试使用 objectid
  • @Sid 是对的..您的数据库中可能没有此特定记录...运行完全相同的代码对我有用..只需添加 Data.create({}).then(console.log) 并将返回的 id 复制到你的 updateData 函数...
  • 这里有一个有趣的点,数据库内部的硬编码_id是一个String类型。几秒钟前我才意识到这一点。因此,findbyid 总是不起作用。现在问题解决了。谢谢大家

标签: node.js mongodb express mongoose


【解决方案1】:

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

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

【讨论】:

  • 这实际上节省了我 2-3 个小时 :)
  • const MyDataSchema = new Schema({ _id: Schema.Types.ObjectId, ... ... }
  • 如果我们将 _id 添加到模式中,那么如果我们尝试在 mongo 中保存一个新文档,它会抛出错误“文档在保存之前必须有一个 _id”。我不认为将 _id 添加到架构中是正确的解决方案。
【解决方案2】:

有一个简单的解决方案:

替换

const result = await Data.findById(id);

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

请参阅 Mongoose - What does the exec function do? 了解 exec() 的作用

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        经过一小时的搜索,我需要像这样将 _id 添加到架构中:

          _id: { type: Schema.Types.ObjectId },
        

        【讨论】:

        • 正是我的问题!!谢谢 :) 我将它作为字符串保存,但由于它保存为 objectId 它不起作用。
        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-05
          • 2016-09-19
          • 1970-01-01
          • 2023-03-20
          • 2019-03-25
          • 1970-01-01
          相关资源
          最近更新 更多