2013-09-23 48 views
1

我試圖隱藏我的REST服務器的GET輸出上的某些字段。我有2個模式,都有一個字段可以將來自彼此的相關數據嵌入到GET中,所以/人會返回他們工作的位置列表,並獲取在那裏工作的位置列表。但是,這樣做會增加一個person.locations.employees字段,然後再次列出員工,這顯然不是我想要的。那麼如何在顯示輸出之前從輸出中刪除該字段?謝謝大家,讓我知道你是否需要更多信息。在貓鼬/節點REST服務器中隱藏嵌入的文檔

/******************** 
/GET :endpoint 
********************/ 
app.get('/:endpoint', function (req, res) { 
    var endpoint = req.params.endpoint; 

    // Select model based on endpoint, otherwise throw err 
    if(endpoint == 'people'){ 
     model = PeopleModel.find().populate('locations'); 
    } else if(endpoint == 'locations'){ 
     model = LocationsModel.find().populate('employees'); 
    } else { 
     return res.send(404, { erorr: "That resource doesn't exist" }); 
    } 

    // Display the results 
    return model.exec(function (err, obj) { 
     if (!err) { 
      return res.send(obj); 
     } else { 
      return res.send(err); 
     }   
    }); 
}); 

這是我的GET邏輯。所以我一直試圖在填充函數之後使用mongoose中的查詢函數來嘗試並過濾掉這些引用。這是我的兩個模式。

peopleSchema.js

return new Schema({ 
    first_name: String, 
    last_name: String, 
    address: {}, 
    image: String, 
    job_title: String, 
    created_at: { type: Date, default: Date.now }, 
    active_until: { type: Date, default: null }, 
    hourly_wage: Number, 
    locations: [{ type: Schema.ObjectId, ref: 'Locations' }], 
    employee_number: Number 
}, { collection: 'people' }); 

locationsSchema.js

return new Schema({ 
    title: String, 
    address: {}, 
    current_manager: String, // Inherit person details 
    alternate_contact: String, // Inherit person details 
    hours: {}, 
    employees: [{ type: Schema.ObjectId, ref: 'People' }], // mixin employees that work at this location 
    created_at: { type: Date, default: Date.now }, 
    active_until: { type: Date, default: null } 
}, { collection: 'locations' }); 

回答

3

您應該指定要使用select()方法來獲取領域。您可以通過做一些像這樣做:

if(endpoint == 'people'){ 
     model = PeopleModel.find().select('locations').populate('locations'); 
    } else if(endpoint == 'locations'){ 
     model = LocationsModel.find().select('employees').populate('employees'); 
    } // ... 

您可以用空格分隔,例如選擇多個字段:

PeopleModel.find().select('first_name last_name locations') ... 
0

解決方案!

因爲這對我來說很難找到我要離開這裏爲其他人。爲了「取消」一個填充項目,只需在字段中加上「 - 」作爲前綴。例如:

PeopleModel.find().populate({path: 'locations', select: '-employees'}); 

而現在locations.employee的將被隱藏。

0

如果您還記得SQL日期,那麼SELECT對要查詢的表進行限制。限制是來自關係模型的原始操作之一,並且隨着關係模型的發展,它仍然是一個有用的功能。等等等等等等。

在貓鼬中,Query.select()方法允許您使用一些額外的功能執行此操作。特別是,您不僅可以指定要返回的屬性(列),還可以指定要排除的屬性。

因此,這裏的例子:

function getPeople(req,res, next) { 
    var query = PeopleModel.find().populate({path: 'locations', select: '-employees'}); 

    query.exec(function(err, people) { 
     // error handling stuff 
     // process and return response stuff 
    }); 
} 

function getLocations(req,res, next) { 
    var query = LocationModel.find().populate({path: 'employees', select: '-locations'}); 

    query.exec(function(err, people) { 
     // error handling stuff 
     // processing and returning response stuff 
    }); 
} 

app.get('people', getPeople); 
app.get('locations', getLocations); 
從貓鼬文檔

直接:

轉到http://mongoosejs.com/docs/populate.html並搜索 「查詢條件和其他選項」

查詢條件其他選項

如果我們想要根據他們的年齡填充我們的粉絲陣列, 只需選擇他們的名字,並且最多返回其中的5個?

Story 
.find(...) 
.populate({ 
    path: 'fans', 
    match: { age: { $gte: 21 }}, 
    select: 'name -_id', 
    options: { limit: 5 } 
}) 
.exec() 

我只是想的話,端點的簡單你可以用這種方式來定義端點脫身。但是,通常這種dispacher模式不是必需的,並且在使用Express進行開發時可能會在開發後期出現問題。

1

選擇是正確的答案,但它也可以幫助您的模式,以指定它使你保持你的API的一致性,我發現它幫助我不記得到處做我的對象上執行一個查詢。

你可以在你的架構設置某些字段從未使用上的架構領域的select: true|false屬性返回。

更多細節可在這裏找到:http://mongoosejs.com/docs/api.html#schematype_SchemaType-select