通过Mongoose通过_id查找

ax6ht2ek  于 12个月前  发布在  Go
关注(0)|答案(9)|浏览(118)

我对 Mongoose 的一个简单的查找有困难。
已确认数据库中存在该项目

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

用 Mongoose

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

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

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

我实际上是想把它和typescript一起使用,所以有了await。
我也试了Story.findById(id)方法,还是找不到。
是否有一些gotcha只是寻找一个普通的_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是一个字符串,不确定这是否会导致Map到其他表的任何问题。我还尝试添加一些类型定义

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

monwx1rj

monwx1rj1#

因为这个查询会在shell中找到文档:

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

这意味着文档中_id的类型实际上是一个字符串,而不是Mongoose所期望的ObjectId
要使用Mongoose查找该文档,您必须在Story的模式中定义_id

_id: { type: String }
4xy9mtcn

4xy9mtcn2#

如果您的Mongo模式配置为使用Object 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')}
qhhrdooz

qhhrdooz3#

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

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

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

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

ukxgm1gy

ukxgm1gy4#

如果_id是默认的mongodb键,在你的模型中设置_id的类型如下:

_id: mongoose.SchemaTypes.ObjectId

然后usind mongoose你可以使用一个正常的find:

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

svmlkihl5#

我们现在是这样做的:

const { mongoose } = require("mongoose");
YourModel.find({ _id: mongoose.Types.ObjectId("572f16439c0d3ffe0bc084a4") });
2q5ifsrm

2q5ifsrm6#

我也进入了这个场景。我是这样解决的

  • 根据mongoose文档,你需要告诉mongoose返回原始js对象,而不是mongoose文档,方法是传递lean选项并将其设置为true。例如
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);
});
68de4m5k

68de4m5k7#

对于Schema和_id,使用默认的mongo键。在Schema中设置typeof _id。

const mongoose = require('mongoose');
 
const projectSchema = new mongoose.Schema({
    _id: mongoose.SchemaTypes.ObjectId,
    //Add another field
});
 

const Project = mongoose.model('Project', projectSchema);
module.exports.ProjectsService = class ProjectsService {

    async getProjectById(req, res) {
        try {
            const projectId = req.params.projectId;             
            let project = await Project.find({ "_id": projectId })
            res.json(project);
        } catch (err) {
            throw err
        };
    };
};
zaq34kh6

zaq34kh69#

试试这个

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

 });

相关问题