2

Feedという名前のmongodbコレクションがあり、「type」という名前の属性があります。その文字列によると、jsonで変更可能なフィールドを送信したい。たとえば、タイプが「写真」の場合、そのようなことをしたい

 schema.find({number: "123456"},"body number",
 function(err, data) {

ただし、文字列が写真ではなくストーリーの場合。同じ 'schema.find' クエリで、"body number" の代わりに "body url" を使用して json を作成する必要があります。それらはすべて同じjsonで渡される必要があります。

  res.json(data);

明確な例として、jsonをこのようにしたいと思います。ご覧のとおり、フィールドは「タイプ」に応じて変化します。しかし、それらは実際にはすべて同じコレクションにあります。

[
    {
        type: 'photo',
        number: 123456,
        url: 'asd.jpg',

    },
    {
        type: 'story',
        body: 'hello',
        number: 123456,

    }
]
4

3 に答える 3

0

このようなドキュメント固有の JSON フォーマットの場合、この gistに示されているように、モデルのデフォルトtoJSONメソッドをオーバーライドできます。Feed

アップデート

ドキュメントにこの種の柔軟性が必要な場合は、さらに簡単です。可能なすべてのフィールドを含めるようにスキーマを定義し、特定のドキュメントに適用されるフィールドのみを設定しますtype。使用しないフィールドは、ドキュメント (または JSON 応答) に表示されません。したがって、スキーマは次のようになります。

var feedSchema = new Schema({
    type: { type: 'String' },
    venue: Number,
    url: String,
    body: String
});
于 2012-09-26T16:12:57.257 に答える
0

したがって、基本的には、Feed コレクションから特定のドキュメント フィールドを取得する必要があります。これらは、たとえば"firstName pic points photos".

フィールドを含むフィード ドキュメントはありstoryますか?

Model.find()はスキーマを作成しません。

コマンドを理解できるように、さらにコードを編集してください。

于 2012-09-26T14:55:57.190 に答える
0

mongoose-schema-extendを見てください。「Discriminator Key」機能を使用すると、個々のケースで適切なモデルを作成するように .find() に指示できます。

コードは次のようになります (テストされていません)。

var feedSchema = new Schema({
    venue: Number,
}, {discriminatorKey : 'type' }});

var photoSchema = feedSchema.extend({
    url: String
});
var storySchema = feedSchema.extend({
    body: String
});

var Feed= mongoose.model('feed', feedSchema );
var Photo= mongoose.model('photo', photoSchema );
var Story= mongoose.model('story', storySchema );
//'photo' and 'story' will be the values for 'type' key


Feed.find({venue: "123456"}, function(err, models) {
   console.log(models[0] instanceof Photo); // true
   console.log(models[0] instanceof Story); // false

   console.log(models[1] instanceof Photo); // false
   console.log(models[1] instanceof Story); // true
});
于 2012-09-26T17:54:56.540 に答える