查询后立即预处理Mongoose文档

时间:2013-11-03 09:42:39

标签: json mongodb mongoose

摘要

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

由于

0 个答案:

没有答案