Я не могу сохранить массив строк в моей БД с помощью 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);