Mongodb 如何从ObjectId字段中查找结果?

Mongodb 如何从ObjectId字段中查找结果?,mongodb,mongoose,Mongodb,Mongoose,如果我有这样一个模式: var Word = new Schema({ name: { type: String, required: true }, language: { type: ObjectId, ref: "Language", required: true } }); 我试着这样询问它 var language = "5078547df6b753bc06000003"; word.find({ language: language }, function (err

如果我有这样一个模式:

var Word = new Schema({
    name: { type: String, required: true },
    language: { type: ObjectId, ref: "Language", required: true }
});
我试着这样询问它

var language = "5078547df6b753bc06000003";
word.find({ language: language }, function (err, words) {
  console.log(words);
});
我得到一个空的结果集(
[]
)。我知道有一个单词使用这种语言,因为如果我删除
{language:language}
我会得到这个对象:

[{
  "_id": "5079fd7b6df57b1b64cbf25d",
  "name": "dog",
  "language": "5078547df6b753bc06000003",
}]
我试过使用

var language = mongoose.Types.ObjectId("5078547df6b753bc06000003");
word.find({ language: language }, //etc.
但它仍然返回一个空的结果集


为什么mongoose找不到具有此语言id的单词?

您已经在模式中将
语言
字段声明为ObjectId,但在MongoDB文档中它实际上是一个字符串。因此,在您的
find
调用中,Mongoose将把
language
变量转换为ObjectId,然后查询将返回
language
是具有该值的ObjectId的任何文档(因为它在数据库中不是ObjectId,所以不会找到任何文档)


您需要更新文档,使
language
包含ObjectId而不是字符串,或者更改架构,使
language
定义为
type:string
。如果您想将
语言
作为模式中的参考,则需要执行前者。

谢谢!我的问题是,我在字段中插入了一个字符串值,假设它会自动转换为ObjectId@PeterOlson如果您通过mongoose
create
调用(或
new
save
调用)创建文档,它会将字符串转换为ObjectId,但如果您使用其他方式,则不会。