2

抽象的

嗨,我有两个模型CityCountry

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 modelper schema预处理,以便我将 ObjectId 转换为字符串

2)可能还有其他更有效的方法来处理这个问题?

谢谢

4

0 回答 0