通过_id找到Mongoose

时间:2016-05-20 13:20:04

标签: node.js mongodb mongoose

我在使用mongoose的简单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();

我实际上是尝试将它与打字稿一起使用,因此等待。

我也尝试了Story.findById(id)方法,但仍无法找到。

是否有一些问题只是通过普通_id字段查找项目? _id必须在Schema中吗? (文档说不)

我可以通过Schema中的其他值找到,_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
  }

enter image description here

7 个答案:

答案 0 :(得分:5)

因为此查询在shell中找到了doc:

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

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

要使用Mongoose查找该文档,您必须在_id的架构中定义Story为:

_id: { type: String }

答案 1 :(得分:3)

如果您将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')}

答案 2 :(得分:2)

一种解决方案是使用mongoose.ObjectId()

const Model = require('./model')
const mongoose = require('mongoose')

Model.find({ id: mongoose.ObjectId(userID) })

它可以工作,但是很奇怪,因为我们使用的是id而不是_id

答案 3 :(得分:0)

我也遇到了这种情况。这就是我解决的方式;

  • 根据mongoose documentation,您需要告诉猫鼬 通过传递lean选项并将其设置为true,返回原始js对象而不是猫鼬文档。例如
Adventure.findById(id, 'name', { lean: true }, function (err, doc) {});

根据您的情况,应该是

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

答案 4 :(得分:0)

如果_id是默认的mongodb密钥,请在您的模型中将_id的类型设置为:

_id: mongoose.SchemaTypes.ObjectId

然后使用usind猫鼬可以使用常规查找:

YourModel.find({"_id": "5f9a86b77676e180c3089c3d"});

答案 5 :(得分:0)

models.findById(id)

试试这个。 参考链接:https://www.geeksforgeeks.org/mongoose-findbyid-function/

答案 6 :(得分:-1)

试试这个

 Story.findOne({_id:"572b19509dac77951ab91a0b"}, function(err, story){
                if (err){
                    console.log("errr",err);
                    //return done(err, null);
                }else{
                    console.log(story);
                }

 });