如何从ObjectId字段中找到结果?

时间:2012-10-15 15:30:50

标签: 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, 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找到这个词?

1 个答案:

答案 0 :(得分:2)

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

您需要更新文档,以便language包含ObjectId而不是字符串,或更改您的架构,以便将language定义为type: String。如果您想将language视为参考,那么您需要执行前者。