1

次のようなスキーマがある場合:

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.

それでも空の結果セットが返されます。

なぜマングースはこの言語 ID の単語を見つけられないのですか?

4

1 に答える 1

2

スキーマでフィールドをObjectIdとして宣言しましlanguageたが、MongoDBドキュメントでは実際には文字列です。したがって、find呼び出しでは、Mongooseはlanguage変数をObjectIdにキャストし、クエリはlanguageその値を持つObjectIdであるすべてのドキュメントを返します(データベース内のObjectIdではないため、ドキュメントは見つかりません)。

language文字列の代わりにObjectIdを含むようにドキュメントを更新するか、languageとして定義されるようにスキーマを変更する必要がありますtype: Stringlanguageスキーマで行っているように参照として扱いたい場合は、前者を行う必要があります。

于 2012-10-15T15:41:42.133 に答える