如果我有这样的架构:
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找到这个词?
答案 0 :(得分:2)
您已将language
字段声明为架构中的ObjectId,但在MongoDB文档中,它实际上是一个字符串。因此,在find
调用中,Mongoose会将language
变量强制转换为ObjectId,然后查询将返回language
是具有该值的ObjectId的所有文档(并且不会找到任何因为它不是数据库中的ObjectId。)
您需要更新文档,以便language
包含ObjectId而不是字符串,或更改您的架构,以便将language
定义为type: String
。如果您想将language
视为参考,那么您需要执行前者。