2014-07-21 4 views
0

솔직히 나를 미치게합니다.배열 서브 문서에서 몽구 검색 ObjectId가 작동하지 않음

var userSchema= new mongoose.Schema(
    { 
     uname:{type:String, index:{sparse:true, unique:true, dropDups:true}}, //the username 
     email:String, 
     pwd:{type:String}, 
     flwng:[{_id : {type : mongoose.Schema.ObjectId},uname : String}], //_id of users I am following 
     flwrsz:Number, 
     flwngsz:Number, 
     feedsz:Number, 
    }, {j: 1});//j:1 means guarantee it is written to the journal. 

userSchema.set('autoIndex', true); 
userSchema.index({"fid":1}, {sparse:true, unique:true, dropDups:true}); 
userSchema.index({"flwng._id" : 1}); 

경우 UID = "53c4f16c431247694f0000a3"==>하지만 난 얻을 : 나는 몽구스에서 다음 쿼리를 실행 해요

: 다음 사용자 스키마에

s.findSubdocument=function(uid, cb) 
{ 
    this.model('User').find({"flwng._id":uid.toString()}).select('flwng').exec(cb); 
} 

여기에 문제의 빈 배열 back :(

문구 셸에서 똑같은 쿼리를 실행할 때 :

db.users.find({"flwng._id":"53c4f16c431247694f0000a3"}); 

올바른 결과를 얻을 수 있습니다. 나는 "flwng._id"에서 인덱스와 스키마를 사용하지 않고 시도했지만, 인덱스를 삭제하려고 시도했지만 reIndex는 이제 아이디어가 부족합니다. 몽구스에 뭔가 잘못하고 있는거야?

도움이 될 것입니다 - 감사합니다! Henri

답변

0

mongodb의 기존 문서와 스키마가 일치하지 않습니다. 당신의 데이터는 flwng._id이 String 인 레코드를 가지고 있습니다. 그래서 당신은 mongo 쉘에서 결과를 얻습니다. 그러나 당신의 몽구스 스키마는 ObjectId으로 정의하므로 mongoose로 쿼리 할 때 mongoose가 문자열 값을 ObjectId으로 캐스팅하고 쿼리가 일치하지 않습니다. 기존 데이터를 수정하기위한 마이그레이션을 작성하거나 String 대 ObjectId 데이터 형식으로 데이터를 일치하도록 스키마를 업데이트하면 모든 것이 몽구스를 통해 작동하기 시작해야합니다.

+0

맞네요! 나는 flwng를 flwng : Array로 바 꾸었습니다. 이제는 올바른 결과 집합을 반환합니다. 기존 String을 ObjectID로 변환하기 위해 어떤 전략을 권장합니까? 나는 결과를 반복하고 그 값을 다음과 같이 캐스팅하지 않으려 고 노력했다. users [i] .flwng [j] ._ id = new mongoose.Types.ObjectId (sUid); 사용자 [i] .save() – cybermach

+0

작동하도록했습니다! 감사합니다 피터. 비슷한 문제가 발생하는 경우, 몽구스에서 다음 쿼리로 작업하기 위해 String -> ObjectId 마이그레이션을 얻었습니다. \t this.model ('User'). update ({ "flwng._id": uid.toString()}, { "flwng. $ ._ id": uid}, {multi : true}) .exec (cb); – cybermach

관련 문제