我对 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
}
9条答案
按热度按时间monwx1rj1#
因为这个查询会在shell中找到文档:
这意味着文档中
_id
的类型实际上是一个字符串,而不是Mongoose所期望的ObjectId
。要使用Mongoose查找该文档,您必须在
Story
的模式中定义_id
:4xy9mtcn2#
如果您的Mongo模式配置为使用Object Id,则可以使用以下命令在nodeJS中查询
models.Foo.findById(id)
其中Foo是你的模型,id是你的id。这里有一个例子
在Mongo DB中,您的查询将是
qhhrdooz3#
一种解决方案是使用mongoose.ObjectId()
它可以工作,但它很奇怪,因为我们使用id而不是_id
ukxgm1gy4#
如果_id是默认的mongodb键,在你的模型中设置_id的类型如下:
然后usind mongoose你可以使用一个正常的find:
svmlkihl5#
我们现在是这样做的:
2q5ifsrm6#
我也进入了这个场景。我是这样解决的
lean
选项并将其设置为true。例如在你的情况下,
68de4m5k7#
对于Schema和_id,使用默认的mongo键。在Schema中设置typeof _id。
djp7away8#
试试这个。参考链接:https://www.geeksforgeeks.org/mongoose-findbyid-function/
zaq34kh69#
试试这个