2014-04-24 3 views
2

MMO 실시간 브라우저 게임을하고 있고 몽구스 (MongoDB)를 사용하여 데이터를 저장하고 있습니다.몽구스로 자바 스크립트 개체를 저장할 수 없습니다.

var playerSchema = new Schema({ name: { type: String, required: true, trim: true, index: { unique: true } }, resources: { wood: { type: Number, required: true, default: 500}, stone: { type: Number, required: true, default: 300}, iron: { type: Number, required: true, default: 0}, cereal: { type: Number, required: true, default: 0} }, resourcesPerHour: { woodPerHour: { type: Number, required: true, default: 40}, stonePerHour: { type: Number, required: true, default: 20}, ironPerHour: { type: Number, required: true, default: 0}, }, res: {type: Array, required:true, default: []}, buildings: { type: Array, required: true, default: []}, researches: { type: Array, required: true, default: []} });

당신이 볼 수 있듯이, res, buildingsresearches가 배열 인 : 모든

첫째, 난 당신에게 내 객체의 구조를 보여 드리겠습니다. 나는 야 쇼 당신은 그들 중 하나 (모두 동일한 구조를 가지고) 있어요 :

var buildingSchema = new Schema({ id: {type: String, requried: true}, name: { type: String, required: true, trim: true, index: { unique: true } }, level: { type: Number, required: true, default: 0}, scalingValue: {type: Number, required: true, default: 2}, costs: { wood: { type: Number, required: true, default:0}, stone: { type:Number, required:true, default:0}, iron: {type:Number, required:true, default:0}, cereal: {type:Number, required:true, default:0} } });

OK, 모든 데이터가 initializated와 내가 선수를 상상한다. 업데이트를 시도 할 때 목록에서 정보 만 업데이트 할 수 있습니다. 이 예제를보세요 :

player.findOne({name:req.session.name}, function(err, doc){ doc.resources.wood -= 200; doc.buildings[id%100].costs.wood *= 2; doc.save(function(err){ if(err)console.log(err); }); }

나는 데이터베이스 모델을 보면

, 그것은 단지 resources.wood 아닌 building[i].costs.wood 저장됩니다. 왜 실패하는지 알 수는 없지만 배열 내의 모든 객체는 new variable을 사용하여 생성됩니다. variable은 스키마 (예 : buildingSchema)입니다.

한 가지만 더 말씀 드리면 doc.save() 앞에 console.log(doc.buildings[i].costs.wood);을 추가 했으므로 괜찮습니다. 즉, 모든 데이터가 잘 수정되었음을 의미하지만, doc.save에서는 '목록에없는'데이터 만 저장합니다.

EDIT : console.log(err);은 아무것도 인쇄하지 않으므로 저장 기능이 작동했습니다. 배열 안에없는

답변

5

스키마에 Array 유형을 사용하는 경우 (docsMixed 유형과 동일) 명시 적으로 필드를 수정 된 것으로 표시해야하거나 Mongoose가 변경 사항을 저장하지 않습니다.

doc.markModified('buildings'); 
doc.save(function(err){ 
    if(err)console.log(err); 
}); 

더 나은 접근 방식은 buildingSchema의 배열을 포함하는 것으로 buildings를 선언 할 수 있습니다 :

buildings: [buildingSchema], 

그런 식으로 몽구스하면 자동으로 buildings 배열에 대한 변경을 추적 할 수 있습니다.

+1

감사합니다. doc.markModified()는 매력처럼 작동했습니다. – Neoares

관련 문제