如何使用mongoose populate每个案例只返回一个客户端?

时间:2013-04-19 01:41:11

标签: node.js mongodb express mongoose

我正在使用mongoose populate在我的模式中尝试创建一对多关系

var clientSchema = new mongoose.Schema({
    name:  { type: String, required: true },
    title: { type: String, default: "N/S" },
    birthDate: { type: Date },
    ssn: { type: String, default: "N/S" },
    spouse: { type: String, default: "N/S" },
    notes: { type: String, default: "N/S" },
    address: { type: String, default: "N/S" },
    city: { type: String, default: "N/S" },
    state: { type: String, default: "N/S" },
    zip: { type: String, default: "N/S" },
    homePhone: { type: String, default: "N/S" },
    workPhone: { type: String, default: "N/S" },
    mobilePhone: { type: String, default: "N/S" },
    fax: { type: String, default: "N/S" },
    email: { type: String, default: "N/S" }
});
var caseSchema = mongoose.Schema({
    _client: { type: mongoose.Schema.Types.ObjectId, ref: 'Client' },
    name: { type: String, required: true },
    lead: { type: String },
    priority: { type: String },
    dateOpened: { type: Date },
    dateAccident: { type: Date },
    status: { type: String },
    sol: { type: Date },
    description: { type: String }
});

我希望能够查询数据库以获取具有给定_client id的所有案例。 我有这个工作,但不是我想要的方式。截至目前,当我使用populate方法时 从我的路线中,我得到了所有具有该客户端ID的案例,但我也得到了 所有客户端,即使所有客户端完全相同。对于每个案例来说,返回同一个客户端似乎是浪费资源。有没有办法只返回客户端一次,然后是所有相关的案例呢?

app.get('/cases/:id', function( req, res ) {
    Case
    .find( { _client: req.params.id } )
    .populate('_client')
    .exec( function( err, cases ) {
        res.send( cases );
    });
});

这是我要回来的:

[
    {
        "_client": {
            "name": "John Doe",
            "birthDate": null,
            "_id": "51705a7ed0ecd0a906000001",
            "__v": 0,
            "email": "",
            "fax": "",
            "mobilePhone": "",
            "workPhone": "",
            "homePhone": "",
            "zip": "",
            "state": "",
            "city": "",
            "address": "",
            "notes": "",
            "spouse": "",
            "ssn": "",
            "title": "Mr"
        },
        "name": "test",
        "lead": "",
        "priority": "",
        "dateOpened": null,
        "dateAccident": null,
        "status": "",
        "sol": null,
        "description": "",
        "_id": "5170679df8ee8dd615000001",
        "__v": 0
    },
    {
        "_client": {
            "name": "John Doe",
            "birthDate": null,
            "_id": "51705a7ed0ecd0a906000001",
            "__v": 0,
            "email": "",
            "fax": "",
            "mobilePhone": "",
            "workPhone": "",
            "homePhone": "",
            "zip": "",
            "state": "",
            "city": "",
            "address": "",
            "notes": "",
            "spouse": "",
            "ssn": "",
            "title": "Mr"
        },
        "name": "newest case",
        "lead": "",
        "priority": "",
        "dateOpened": null,
        "dateAccident": null,
        "status": "",
        "sol": null,
        "description": "",
        "_id": "517067d8806f060b16000001",
        "__v": 0
    },
    {
        "_client": {
            "name": "John Doe",
            "birthDate": null,
            "_id": "51705a7ed0ecd0a906000001",
            "__v": 0,
            "email": "",
            "fax": "",
            "mobilePhone": "",
            "workPhone": "",
            "homePhone": "",
            "zip": "",
            "state": "",
            "city": "",
            "address": "",
            "notes": "",
            "spouse": "",
            "ssn": "",
            "title": "Mr"
        },
        "name": "adding new case",
        "lead": "Me",
        "priority": "Urgent",
        "dateOpened": null,
        "dateAccident": null,
        "status": "",
        "sol": null,
        "description": "",
        "_id": "51709a16806f060b16000002",
        "__v": 0
    }
]

这似乎不适合将所有这些膨胀发送到我的视图以进行渲染。我是否应该像这样使用一对多填充? 我在mongoose.com上看到的所有示例都是一对一的,但嵌入式文档除外。

1 个答案:

答案 0 :(得分:2)

如果您不希望每个案例重复客户端,最好单独查询客户端,然后将该结果与Case查询的结果相结合(不包括populate以任何你需要的方式。

BTW,'/cases/:id'是一个非常令人困惑的网址,用于按客户端ID而不是案例ID获取案例。