1

REST サーバーの GET 出力で特定のフィールドを非表示にしようとしています。私は 2 つのスキーマを持っていますが、どちらも相互に関連するデータを GET に埋め込むためのフィールドを持っているため、/people を取得すると、彼らが働いている場所のリストが返され、場所のリストを取得するとそこで働く人が返されます。ただし、これを行うと、 person.locations.employees フィールドが追加され、従業員が再び一覧表示されます。これは明らかに望ましくありません。では、表示する前にそのフィールドを出力から削除するにはどうすればよいでしょうか? ありがとうございます。さらに情報が必要な場合はお知らせください。

/********************
/ 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ロジックです。そのため、populate 関数の後に mongoose でクエリ関数を使用して、それらの参照を除外しようとしました。これが私の2つのスキーマです。

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' });

locationSchema.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' });
4

4 に答える 4

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') ...
于 2013-09-23T00:40:10.383 に答える
1

Select は正しい答えですが、API の一貫性を維持するためにスキーマで指定することも役立つ場合があります。オブジェクトに対してクエリを実行するすべての場所でそれを行うことを忘れないようにするのに役立つことがわかりました。

select: true|falseスキーマ フィールドの属性を使用して、スキーマ内の特定のフィールドが返されないように設定できます。

詳細については、http: //mongoosejs.com/docs/api.html#schematype_SchemaType-selectを参照してください。

于 2015-11-13T01:21:17.383 に答える
0

SQL 時代を思い出すと、SELECT はクエリ対象のテーブルに対して制限を行います。制限は、リレーショナル モデルの原始的な操作の 1 つであり、リレーショナル モデルが進化するにつれて引き続き有用な機能です。何とか何とか何とか。

mongoose では、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);

Mongoose Docs から直接:

http://mongoosejs.com/docs/populate.htmlに移動し、「クエリ条件とその他のオプション」を検索します

クエリ条件とその他のオプション

年齢に基づいてファンの配列を設定し、名前だけを選択して、最大で 5 人を返したい場合はどうなるでしょうか?

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

エンドポイントを単純にするために、この方法でエンドポイントを定義することができる場合があることに注意してください。ただし、一般に、この種のディスパッチャ パターンは必要なく、後の開発で Express を使用して開発するときに問題が発生する可能性があります。

于 2014-03-19T17:08:06.540 に答える