如何在mongoose查询中使用if语句?

时间:2012-09-26 14:18:52

标签: node.js mongodb mongoose

我有一个名为Feed的mongodb集合,它有一个名为“type”的属性。根据该字符串,我想用json发送一个可更改的字段。例如,如果type是“photo”,我想做那样的事情

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

但如果字符串是故事,而不是照片;在相同的'schema.find'查询中,它应该创建一个带有“body url”而不是“body number”的json。他们都应该和同一个json一起传递。

  res.json(data);

一个明显的例子,我希望我的json是这样的。因为你的字段根据“类型”改变。但它们实际上都在同一个系列中。

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

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

    }
]

3 个答案:

答案 0 :(得分:0)

所以基本上你想要从Feed集合中返回某些文档字段,这些字段在变量中指定,例如, "firstName pic points photos"

是否有包含story字段的Feed文档?

Model.find()不会创建任何架构。

也许可以使用更多代码进行编辑,以便我们了解命令。

答案 1 :(得分:0)

对于像这样的特定于文档的JSON格式,您可以覆盖toJSON模型的默认Feed方法,如this gist所示。

<强>更新

如果您希望在文档中具有这种灵活性,那么它就更容易了。只需定义您的架构以包含所有可能的字段,然后只设置适用于其type的给定文档的字段。您不使用的字段不会出现在文档中(或JSON响应中)。所以你的架构看起来像:

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

答案 2 :(得分: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
});