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, я посылаю массив в тело – однако каждый раз, когда я проверяю БД, он просто показывает одну запись с массивом в целом, то есть как я его отправил:

введите описание изображения здесь

Любые идеи, что я должен делать?

Напишите мой комментарий:

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

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

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

 console.log(typeof req.body.tags) 

Если это возвращает строку, убедитесь, что тип содержимого в Postman для JSON указан в этом скриншоте, а не по умолчанию.

Попробуйте изменить схему на

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

или вы можете использовать смешанный тип

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

РЕДАКТИРОВАТЬ

Я думаю, проблема связана с назначением. Использование:

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

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

Надеюсь это поможет.

 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 } 

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

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