Node.js 使用猫鼬按id查找
我和猫鼬的一个简单的findById有问题 已确认数据库中存在该项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,但仍然找不到(尽管
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')}
我也陷入了这种情况。我就是这样解决的
- 根据调查,你需要告诉猫鼬
通过传递
选项并将其设置为true,返回原始js对象,而不是mongoose文档。e、 glean
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)