【问题标题】:Mongoose - Save array of stringsMongoose - 保存字符串数组
【发布时间】:2016-06-01 06:43:44
【问题描述】:

我无法使用 Mongoose 将字符串数组保存到我的数据库中。

(注意下面的所有代码都是为了方便在这里编写而简化的)

所以我声明了一个我拥有的人员模式的变量:

var newPerson = new Person ({
    tags: req.body.tags
});

架构本身如下所示:

var personSchema = new mongoose.Schema({
  tags: Array
});

当谈到保存它只是一个简单的:

newPerson.save(function(err) {
    //basic return of json
});

因此,我使用 Postman 在正文中发送了一个数组 - 但是每次我检查数据库时,它只显示一个包含整个数组的条目,即我如何发送它:

知道我应该做些什么额外的事情吗?

【问题讨论】:

  • 这行得通吗? - var personSchema = new mongoose.Schema({ tags: [{type: String}] });
  • 怎么样:var personSchema = new mongoose.Schema({ tags: [String] });
  • 很遗憾也不是
  • 你确定req.body.tags 是一个数组吗?尝试做 - console.log(typeof req.body.tags) 或 Array.isArray(req.body.tags)
  • 啊! - 这是一个字符串。好地方 那么 Postman ['people', 'players'] 有什么问题呢?

标签: node.js mongodb express mongoose


【解决方案1】:
var personSchema = new mongoose.Schema({
  tags: [{type: String}]
});

在架构中使用它。

保存数组:

var etc = new modename({yourprimaryid: primaryid});
                        for (var i = 0; i < tag.length; i++) {
                            etc.tag.push(tag[i]);
                        }
                        etc.save(function(err) {
                          //whatever you want here
                        }

【讨论】:

  • 谢谢@Siddharth Ajmera
  • @userMod2 在这种情况下也发布其他代码,因为不应该存在架构问题。我实际上使用 Express Mongoose (Mongo),并且我使用过类似的系统。
  • 我只是在这里复制了一些代码,我不得不编辑其中的主要部分。请检查这是否适合您。
【解决方案2】:

尝试将架构更改为

var personSchema = new mongoose.Schema({
  tags: [{type: String}]
});

或者你可以使用混合类型

var personSchema = new mongoose.Schema({
  tags: mongoose.Schema.Types.Mixed
});

编辑

我认为问题在于分配。使用:

person.tags.push("string to push");

【讨论】:

  • 如果这不起作用,那么我认为问题出在其他地方,而不是架构中
【解决方案3】:

从我的评论中写出来:

在mongoose中指定字符串数组的方式是这样的:

var personSchema = new mongoose.Schema({
tags: [{
    type: String
}]

但是,这里的问题很可能与 Postman 相关,因为它会将“数组”作为字符串发送。您可以通过检查req.body.tags 的类型来检查这一点,如下所示:

console.log(typeof req.body.tags)

如果这返回一个字符串,请确保将 Postman 中的内容类型设置为 JSON,如 this 屏幕截图所示,而不是默认的“表单数据”选项。

【讨论】:

  • 问题在于 Postman 没有将我的数组作为一个数组,而是一个字符串
  • 确实,希望设置内容类型可以解决它。您总是可以将它填充到一个对象中并将其作为 JSON 对象发送。
  • 如何在数组中不重复的情况下推送更多数据?
【解决方案4】:

首先,正如许多人所指出的,架构需要更改以表明tags 字段旨在保存一个字符串数组,而不仅仅是一个字符串。所以需要改为:

var personSchema = new mongoose.Schema({
  tags: [String]
});

您需要记住的另一件事(这给我带来了很多麻烦)是,保存时,请确保为 tags 字段使用新数组。例如,这不会工作:

person.tags[0] = "new tag";
person.save();

相反,您需要执行以下操作:

person.tags = person.tags.slice(); // Clone the tags array
person.tags[0] = "new tag";
person.save();

希望这会有所帮助。

【讨论】:

【解决方案5】:

定义架构:

const schema = new Schema({
  name: { type: String, required: true },
  tags: [String]
});

在 postman 中使用下面的数组语法分别添加每个元素

name:Thing
tags[]:task
tags[]:other
tags[]:thing

返回数据:

{
    "__v": 0,
    "name": "Thing",
    "_id": "5a96e8d0c7b7d1323c677b33",
    "tags": [
        "task",
        "other",
        "thing"
    ]
}

【讨论】:

    【解决方案6】:
    var schema = new Schema({
      name:    String,
      binary:  Buffer,
      living:  Boolean,
      updated: { type: Date, default: Date.now },
      age:     { type: Number, min: 18, max: 65 },
      mixed:   Schema.Types.Mixed,
      _someId: Schema.Types.ObjectId,
      decimal: Schema.Types.Decimal128,
      array: [],
      ofString: [String],
      ofNumber: [Number],
      ofDates: [Date],
      ofBuffer: [Buffer],
      ofBoolean: [Boolean],
      ofMixed: [Schema.Types.Mixed],
      ofObjectId: [Schema.Types.ObjectId],
      ofArrays: [[]],
      ofArrayOfNumbers: [[Number]],
      nested: {
        stuff: { type: String, lowercase: true, trim: true }
      },
      map: Map,
      mapOfString: {
        type: Map,
        of: String
      }
    })
    
    // example use
    
    var Thing = mongoose.model('Thing', schema);
    
    var m = new Thing;
    m.name = 'Statue of Liberty';
    m.age = 125;
    m.updated = new Date;
    m.binary = Buffer.alloc(0);
    m.living = false;
    m.mixed = { any: { thing: 'i want' } };
    m.markModified('mixed');
    m._someId = new mongoose.Types.ObjectId;
    m.array.push(1);
    m.ofString.push("strings!");
    m.ofNumber.unshift(1,2,3,4);
    m.ofDates.addToSet(new Date);
    m.ofBuffer.pop();
    m.ofMixed = [1, [], 'three', { four: 5 }];
    m.nested.stuff = 'good';
    m.map = new Map([['key', 'value']]);
    m.save(callback);
    

    【讨论】:

    • 尽我所能,但它仍然显示没有数据的数组键。 (空数组键)
    【解决方案7】:
    1. 在架构上

      techs: Array

    2. 关于邮递员

      "techs": ["express","rect","html","css","scss"]

    3. 在数据库(MongoDB)上

      "techs" : [ "epxress", "rect", "html", "css", "scss" ]

    【讨论】:

      【解决方案8】:

      这也行

      var personSchema = new mongoose.Schema({
          tags: {
              type: [String], default: []
          }
      });
      

      【讨论】:

        【解决方案9】:
        1. 在架构上:
          (因为你在问题中提到它是一个字符串数组)
        var personSchema = new mongoose.Schema({
          tags:{
             type:[String],
             required: true
          }
        }); 
        
        1. 关于邮递员:
        {
          "tags": ["css", "javascript", "mongoose", "node"]
        }
        
        1. 在 MongoDB 上
        {
          "tags":["css", "javascript", "mongoose", "node"]
        }
        

        同样,您可以在 mongoose 架构中创建其他类型的原始数组和文档数组,如下所示:

        ({
          toys: [ToySchema],
          buffers: [Buffer],
          strings: [String],
          numbers: [Number]
          // ... etc
        });
        

        【讨论】:

          【解决方案10】:

          我有一个类似的问题, 在模型中,这样做:

          tags : {[String], default: undefined}
          

          所以它默认为 undefined un 而不是一个空数组, 而不是这个:

          const person = new Person({
              tags : req.body.tags
          });
          

          这样做:

          const person = new Person();
          person.tags = req.body.tags;
          

          【讨论】:

            猜你喜欢
            • 2021-04-20
            • 1970-01-01
            • 2013-12-27
            • 2021-01-21
            • 2021-05-06
            • 1970-01-01
            • 1970-01-01
            • 2021-10-11
            • 1970-01-01
            相关资源
            最近更新 更多