2016-02-19 2 views
5

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

Таким образом, используя Почтальон я отправить в массиве в организме - тем не менее каждый раз, когда я проверить базу данных, он просто показывает одну запись с массивом в целом то, как я его послал:

enter image description here

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

+2

делает эту работу? - 'вар personSchema = новые mongoose.Schema ({ теги: [{Тип: String}] });' –

+0

Нету - ниже Didnt работы – userMod2

+0

насчет просто: 'вар personSchema = новый mongoose.Schema ({ теги : [String] }); ' –

ответ

17

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

Путь к указать массив строк в мангустов, как так:

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

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

console.log(typeof req.body.tags) 

Если это возвращает строку, убедитесь, чтобы установить тип содержимого в Почтальон в формате JSON, как показано на скриншоте this, а не по умолчанию «form- данных ".

+0

Проблема заключается в том, что Postman не принимает мой массив как массив, а скорее строку – userMod2

+0

Действительно, надеюсь, тип исправит его. Вы всегда можете вставить его в объект и отправить его как объект JSON. –

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 
         } 
+0

Не повезло с этим – userMod2

+0

Спасибо @Siddharth Ajmera –

+0

@ userMod2 Опубликовать другие коды, а также в этом случае, потому что проблемы схемы не должно быть. Я фактически использую Express Mongoose (Mongo), и я использовал подобную систему. –

1

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

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

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

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

EDIT

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

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

ни один из тех не работал – userMod2

+0

, если это не сработало, я думаю, что проблема находится где-то в другом месте, а не в схеме –

0

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

Надеется, что это помогает.

+0

Нет необходимости нарезать массив. Mongoose построил методы для добавления элементов в массив документа. использование '.push()' будет работать отлично. См. Здесь http://mongoosejs.com/docs/api.html#types-array-js –

0

Определение схемы:

const schema = new Schema({ 
    name: { type: String, required: true }, 
    tags: [String] 
}); 

В почтальона добавить каждый элемент по отдельности, используя синтаксис массива ниже

name:Thing 
tags[]:task 
tags[]:other 
tags[]:thing 

возвращаемые данные:

{ 
    "__v": 0, 
    "name": "Thing", 
    "_id": "5a96e8d0c7b7d1323c677b33", 
    "tags": [ 
     "task", 
     "other", 
     "thing" 
    ] 
}