2012-10-15 6 views
1

이 같은 스키마가있는 경우 :ObjectId 필드에서 어떻게 결과를 찾을 수 있습니까?

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); 
}); 

처럼 쿼리하려고합니다. 내가

var language = mongoose.Types.ObjectId("5078547df6b753bc06000003"); 
word.find({ language: language }, //etc. 

를 사용하려고했습니다

[{ 
    "_id": "5079fd7b6df57b1b64cbf25d", 
    "name": "dog", 
    "language": "5078547df6b753bc06000003", 
}] 

하지만 여전히 빈 결과 집합을 반환 : 나는이 {language: language}를 제거하면 내가이 개체를 얻을 수 있기 때문에,이 언어와 단어가 존재하는 것을 알고있다.

왜 몽구스가이 언어 ID로 단어를 찾을 수 없습니까?

답변

2

language 필드를 스키마의 ObjectId로 선언했지만 MongoDB 문서에서는 실제로 문자열입니다. 따라서 find 호출에서 Mongoose는 ObjectId에 language 변수를 캐스팅 한 다음이 값을 사용하여 language이 ObjectId 인 모든 문서를 반환합니다 (데이터베이스의 ObjectId가 아니기 때문에 아무 것도 찾지 못합니다).

languagelanguagetype: String으로 정의되도록 문자열 대신 ObjectId가 포함되도록 스키마를 변경하거나 문서를 업데이트해야합니다. 스키마에서 수행중인 것처럼 language을 참조로 처리하려면 이전 작업을 수행해야합니다.

+0

고마워요! 내 문제는 필드에 문자열 값을 삽입했다는 것인데, 자동으로 ObjectId로 변환된다고 가정합니다. –

+0

@PeterOlson mongoose'create' 호출을 통해 문서를 만들면 문자열을 ObjectId로 변환합니다 (또는'new' 'save')하지만, 다른 방법으로 사용하면 안됩니다. – JohnnyHK

관련 문제