抽象的
嗨,我有两个模型City
和Country
:
var Country = new Schema({
name: String,
population: String
});
var City = new Schema({
name: String,
timeZone: { type: Number, min: -12, max: 12 },
summerTime: Boolean,
country: { type: Schema.ObjectId, ref: 'Country'}
});
当我使用以下方式从 mongo 查询数据时:
function (request, response) {
var CityModel = mongoose.model('City', City);
CityModel.find().lean().populate('country').exec(function(err, docs){
response.send(JSON.stringify(docs));
});
}
但是在客户端上,当我解析 JSON 时,我得到了同一个国家的多个实例:
var cities = $.get('/cities').then(function(citiesJson){
var cities = JSON.parse(citiesJson);
var washingtonIndex = ...;
var californiaIndex = ...;
var washington = cities[washingtonIndex];
var california = cities[californiaIndex];
washington.country.population = "300 000 000";
california.country.population = "500 000 000";
console.log([california.country.population, california.country.population]);
});
["300 000 000", "500 000 000"]
结果在控制台中有两个值。
问题
为了防止这种行为并保留对象引用,我在对象序列化之前执行JSON.decycle :
...
response.send(JSON.stringify(JSON.decycle(docs)));
...
它比应有的效果更好。结果,我在客户端上得到了以下 JSON:
// City:
{
name: "Bost",
deleted: "0",
country: {
$ref: "$[0]["city"]["country"]"
},
lastModified: "2013-08-06T23:44:11.000Z",
_id: {
_bsontype: "ObjectID",
id: "Rm1'"
},
approved: "1"
}
请注意_id
正在序列化的字段,by reference
因此我没有在客户端上获得实际的 ObjectId 字符串表示,而是获得了一些mongo
在客户端上不可用的 id 的内部表示。
问题
1)有没有办法为所有查询的文档设置per model
或per schema
预处理,以便我将 ObjectId 转换为字符串
2)可能还有其他更有效的方法来处理这个问题?
谢谢