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
-
На схеме
techs: Array
-
На почтальоне
"techs": ["express","rect","html","css","scss"]
-
На БД (MongoDB)
"techs": [ "epxress", "rect", "html", "css", "scss" ]