Mongoose - 保存字符串数组

时间:2016-02-19 16:04:34

标签: node.js mongodb express mongoose

我无法使用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我在身体中发送一个数组 - 但每次我检查数据库时,它只显示一个整个数组的条目,即我发送它的方式:

enter image description here

我还应该做些什么?

10 个答案:

答案 0 :(得分:38)

从我的评论中写下:

在mongoose中指定字符串数组的方式如下:

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

然而,这里的问题最有可能与Postman有关,因为它正在发送'数组'作为一个字符串。您可以通过检查req.body.tags的类型来检查这一点:

console.log(typeof req.body.tags)

如果这返回一个String,请确保将Postman中的内容类型设置为JSON,如this屏幕截图所示,而不是默认的' form-data'选项。

答案 1 :(得分:3)

尝试将架构更改为

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

或者您可以使用混合类型

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

修改

我认为问题在于作业。使用:

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

答案 2 :(得分:1)

首先,正如许多人所指出的那样,架构需要更改以指示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();

希望这有帮助。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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
                        }

答案 6 :(得分:0)

定义架构:

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"
    ]
}

答案 7 :(得分:0)

  1. 在架构上

    yourwebsitename.com

  2. 邮递员上

    yourEndpointNameOnTheCDN.azureedge.net

  3. 在DB(MongoDB)上

    techs: Array

答案 8 :(得分:0)

这也将起作用

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

答案 9 :(得分:0)

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

tags : {[String], default: undefined}

所以它默认为 undefined 而非空数组, 而不是这样:

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

这样做:

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