Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用猫鼬按id查找_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 使用猫鼬按id查找

Node.js 使用猫鼬按id查找,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我和猫鼬的一个简单的findById有问题 已确认数据库中存在该项 db.getCollection('stories').find({_id:'572f16439c0d3ffe0bc084a4'}) 猫鼬 Story.findById(topic.storyId, function(err, res) { logger.info("res", res); assert.isNotNull(res); }); 我找不到 我也试过转换成mongoId,但仍然找不到(尽管

我和猫鼬的一个简单的findById有问题

已确认数据库中存在该项

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

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

我也试过转换成mongoId,但仍然找不到(尽管mongoose据说是为你做的)

实际上,我正试图将其与typescript一起使用,因此使用了wait

我还尝试了
Story.findById(id)
方法,但仍然找不到

仅仅通过一个普通的
\u id
字段查找项目有什么困难吗? _id是否必须在架构中?(医生说不)

我可以通过模式中的其他值找到,只是
\u 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);
      });

    }

  });


});
我注意到
topic.storyId
是一个字符串 不确定这是否会导致映射到其他表时出现任何问题。 我还尝试添加了一些type def

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

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

 });

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

db.getCollection('stories').find({_id:'572f16439c0d3ffe0bc084a4'})
这意味着文档中的
\u id
类型实际上是一个字符串,而不是Mongoose所期望的
ObjectId

要使用Mongoose查找该文档,您必须在
故事
的模式中定义
\u id

_id: { type: String }

如果将Mongo模式配置为使用对象Id,则可以使用

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')}

我也陷入了这种情况。我就是这样解决的

  • 根据调查,你需要告诉猫鼬 通过传递
    lean
    选项并将其设置为true,返回原始js对象,而不是mongoose文档。e、 g
Adventure.findById(id,'name',{lean:true},函数(err,doc){});
在你的情况下,这将是

Story.findById(topic.storyId,{lean:true},函数(err,res){
logger.info(“res”,res);
assert.isNotNull(res);
});

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


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

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

_id: mongoose.SchemaTypes.ObjectId
然后使用查找猫鼬,您可以使用普通查找:

YourModel.find({"_id": "5f9a86b77676e180c3089c3d"});
试试这个。
参考链接:

\u默认情况下创建id,无需将其添加到架构中。您是否能够检索记录?如果是这样,在使用该_id时,请尝试将其转换为toObject()。我不确定是否尝试一下!!!这听起来是正确的情况。我正在迁移一些在我们开始使用mongo之前创建的数据,因此类型可能不一致。我试试这个,谢谢!这就是问题所在,并且很好地发现基本的shell查询(不使用ObjectId)正在工作,因此这就是放弃。也适用于mongoose,
const modelSchema=newschema({u id:{type:String},{strict:false})任何错误或使用dbA位OT中存在的正确id,但
冒险
故事
听起来很有趣。你在做一个冒险游戏引擎吗?是的,简单又容易!
const Model = require('./model')
const mongoose = require('mongoose')

Model.find({ id: mongoose.ObjectId(userID) })
_id: mongoose.SchemaTypes.ObjectId
YourModel.find({"_id": "5f9a86b77676e180c3089c3d"});
models.findById(id)