【问题标题】:How can i use an if statement in a mongoose query?如何在猫鼬查询中使用 if 语句?
【发布时间】:2012-09-27 04:49:09
【问题描述】:

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

 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,

    }
]

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

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

    是否有带有 story 字段的 Feed 文档?

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

    也许可以编辑更多代码,以便我们理解命令。

    【讨论】:

      【解决方案2】:

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

      更新

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

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

      【讨论】:

      • 我的问题不在于 json。根据类型字段,我希望我的字段像我在示例中显示的那样更改。例如,如果类型是照片,则其他字段必须是地点和网址,或者如果是故事,其他字段应该是正文和地点。跨度>
      • 我已经有了这个架构。但是在我的“feed.find”查询中,我必须使用某种 if 语句,以便如果类型是“照片”,我只能使用此模式 ElSE 的某些字段,如果类型是“故事”,我可以使用其余字段。最后我希望我的 json 就像我在示例中写的那样。
      • @siemya 因此,您想根据每个文档的type 值更改从数据库读取的数据中包含文档中的哪些字段?您不能在 find 查询中这样做。
      • 那我该怎么做呢?我应该使用场地编号为 12345 的模式来执行此操作。
      【解决方案3】:

      看看mongoose-schema-extend。使用“判别器键”功能,您可以指示 .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
      });
      

      【讨论】:

        猜你喜欢
        • 2016-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-08
        • 2015-06-24
        • 2012-02-03
        • 2013-01-08
        • 2012-01-16
        相关资源
        最近更新 更多