当前位置: 首页 > 知识库问答 >
问题:

使用Mongoose查找by_id

公冶智刚
2023-03-14

我对猫鼬的简单findById有麻烦。

已确认该项目存在于数据库中

db.getCollection('stories').find({_id:'572f16439c0d3ffe0bc084a4'})

与猫鼬

  Story.findById(topic.storyId, function(err, res) {
    logger.info("res", res);
    assert.isNotNull(res);
  });

不会找到的。

我也试过转换成mongoId,仍然找不到(即使mongoose应该是为你做这件事的)

var mid = mongoose.Types.ObjectId(storyId);
let story = await Story.findOne({_id: mid}).exec();

实际上,我正在尝试将它与typescript一起使用,因此使用了Await。

我也尝试了story.findbyid(id)方法,仍然找不到。

是否有一些方法可以通过简单的_id字段来查找项目?_id必须在模式中吗?(文件说不是)

我可以通过模式中的其他值找到,只是_id不能使用...

更新:我为此写了一个简短的测试

describe("StoryConvert", function() {


  it("should read a list of topics", async function test() {
    let topics = await Topic.find({});

    for (let i = 0; i < topics.length; i ++) {
      let topic = topics[i];
    // topics.forEach( async function(topic) {
      let storyId = topic.storyId;
      let mid = mongoose.Types.ObjectId(storyId);
      let story = await Story.findOne({_id: mid});
      // let story = await Story.findById(topic.storyId).exec();
      // assert.equal(topic.storyId, story._id);
      logger.info("storyId", storyId);
      logger.info("mid", mid);
      logger.info("story", story);
      Story.findOne({_id: storyId}, function(err, res) {
        if (err) {
          logger.error(err);
        } else {
          logger.info("no error");
        }
        logger.info("res1", res);
      });

      Story.findOne({_id: mid}, function(err, res) {
        logger.info("res2", res);
      });

      Story.findById(mid, function(err, res) {
        logger.info("res3", res);
        // assert.isNotNull(res);
      });

    }

  });


});

它会返回像这样的东西

Testing storyId 572f16439c0d3ffe0bc084a4

Testing mid 572f16439c0d3ffe0bc084a4

Testing story null

Testing no error

Testing res1 null

Testing res2 null

Testing res3 null

我注意到topic.storyid是一个字符串,不确定这是否会导致映射到其他表的任何问题。我还尝试添加一些类型defs

  storyId: {
    type: mongoose.Schema.Types.ObjectId,
    required: false
  }

共有2个答案

俞涵涤
2023-03-14

如果您的Mongo模式被配置为使用对象Id,那么您可以在nodeJS中使用

models.foo.findById(id)

其中Foo是您的模型,id是您的id。下面是一个工作示例

router.get('/:id', function(req, res, next) {
    var id = req.params.id
    models.Foo.findById(id)        
        .lean().exec(function (err, results) {
        if (err) return console.error(err)
        try {
            console.log(results)            
        } catch (error) {
            console.log("errror getting results")
            console.log(error)
        } 
    })
})

在Mongo DB中,您的查询将是

{_id:ObjectId('5c09fb04ff03a672a26fb23a')}
谈琦
2023-03-14

因为该查询在shell中查找文档:

db.getCollection('stories').find({_id:'572f16439c0d3ffe0bc084a4'})

这意味着文档中的_id的类型实际上是一个字符串,而不是Mongoose所期望的objectid

要使用Mongoose查找该文档,必须在story的模式中定义_id为:

_id: { type: String }
 类似资料:
  • 问题内容: 我正在尝试仅选择一个特定的领域 但是在我的json响应中,我也收到_id,我的文档架构只有两个字段,_id和name 为什么??? 问题答案: 除非您明确排除该字段,否则该字段始终存在。使用以下语法: 或通过对象显式:

  • 我要使用集合中包含的日期字段查找文档 我想找到以'2018-01-03T11:00:'开头的所有文档 我想忽略Millesecobde和ISOtype..等的部分 无论第二个只是核实日期,小时和分钟。

  • 问题内容: 我有Mongoose架构,其中有一个天属性 我想查找输入的最后一天的数据,所以说今天就是我要查找输入的最后一天。或者说另一种说法。什么是属性小于等于但大于所有其他文档的文档呢? 或另一种方式 属性小于等于的所有文档集中的最大元素是什么 然后遍历我所有的文档,我该怎么做呢? 问题答案: 在外壳中将是: 查找所有小于16085 的文档,对它们进行降序排序,然后采用第一个。 在Mongoos

  • 本文向大家介绍Node.js 使用Mongoose和Express.js路由在MongoDB中查找数据,包括了Node.js 使用Mongoose和Express.js路由在MongoDB中查找数据的使用技巧和注意事项,需要的朋友参考一下 示例 设定 首先,使用以下命令安装必要的软件包: 代码 然后,将依赖项添加到server.js,创建数据库模式和集合名称,创建Express.js服务器,并连接

  • 我正在构建一个搜索查询,即使在用户键入时,它也会根据其ID查找数据库对象。 这里的问题是,当与ID不完全相同时,它将不返回任何内容。如何返回带有部分的ID? 编辑:我的订单模型模式

  • 问题内容: 我试图找出如何用Mongoose做特定的查询。我在mongodb中有这样的东西: 我想获取实际日期和modificationDate之间的差异大于5天的所有对象。 问题答案: 计算5天的截止时间,然后使用运算符和计算出的截止值执行: