我在使用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
}
答案 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)
我也遇到了这种情况。这就是我解决的方式;
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);
}
});