嗨,我有两个型号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)可能还有其他一些更有效的方法来处理这个问题?
由于