【问题标题】:findOne not hitting value I know is therefindOne 没有达到我知道的价值
【发布时间】:2018-07-30 18:11:39
【问题描述】:

所以我知道我当前的 ID 在我的数据库中,但 findOne 没有点击它。当我控制台日志req.params.video_id 它显示正确的ID。我该如何开始调试呢?我通过 MLAB UI 验证了视频在我的数据库中。

VideoSchema 片段

video: {
    type: Schema.Types.ObjectId,
    ref: "users"
  }

API 路由

Video.findOne({ video: req.params.video_id })
      .then(video => {
        res.json(video);
      })
      .catch(err => {
        res.status(404).json({ video: "Video doesn't exist" });
      });

【问题讨论】:

  • 我要做的第一件事是确保连接到正确的数据库。你能正确运行任何查询并从数据库中取回任何东西吗?您可以运行 .find() 并返回您要查找的内容吗?
  • 所以,如果我这样做 Video.find({ video: req.params.video_id }) .then(video => { console.log({ video }); }) .catch(err => console.log(err)); 。它返回一个空数组
  • 如果您在没有查询的情况下执行 .find 会怎样? IE。 。寻找({})。你仍然得到一个空数组吗?如果是这样,您没有正确连接到数据库。如果您确实得到了您所期望的记录,您可以发布有问题的对象吗?
  • 试试这个:mongoose.set('debug', true);它将在控制台上记录一个查询,您会发现实际问题是什么

标签: javascript node.js mongodb mongoose mongoose-schema


【解决方案1】:

由于您的视频架构中的 type 被定义为 ObjectId,请尝试使用 ObjectId 类型进行搜索,如果您得到任何结果。

var ObjectId = require('mongoose').Types.ObjectId; 
Video.findOne({ video: new ObjectId(req.params.video_id) })

【讨论】:

    【解决方案2】:

    所以我知道我当前的 ID 在我的数据库中,但 findOne 没有找到它。

    这是因为video 的类型为Schema.Types.ObjectId。但是您在查询时没有将其转换为 ObjectId

    铸造会导致,

    'use strict';
    
    let mongoose = require('mongoose');
    
    Video.findOne({
      video: mongoose.Types.ObjectId(req.params.video_id)
    }).then(video => {
      res.json(video);
    }).catch(err => {
      res.status(404).json({
        video: "Video doesn't exist"
      });
    });
    

    【讨论】:

      猜你喜欢
      • 2020-01-06
      • 1970-01-01
      • 2021-10-20
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2014-05-02
      • 1970-01-01
      相关资源
      最近更新 更多