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

Есть идеи, что еще я должен делать?

Ответ 1

Запишите из моего комментария:

Способ указания массива строк в мангусте выглядит так:

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

Однако проблема здесь наиболее вероятна для Postman, поскольку она отправляет "массив" в виде строки. Вы можете проверить это, проверив тип req.body.tags следующим образом:

console.log(typeof req.body.tags)

Если это возвращает строку, убедитесь, что тип контента в Postman для JSON показан как this, а не по умолчанию, form-data '.

Ответ 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

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

Во-первых, как отмечали многие люди, необходимо изменить схему, чтобы указать, что поле 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

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

Определите схему:

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

  1. На схеме

    techs: Array

  2. На почтальоне

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

  3. На БД (MongoDB)

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