2016-02-19 40 views
5

Non riesco a salvare un array di stringhe nel mio DB usando Mongoose.Mongoose - Salva array di stringhe

(nota tutto il codice qui sotto è semplificato per la facilità di scrivere qui)

Così ho dichiarare una variabile di uno schema persona che ho:

var newPerson = new Person ({ 
    tags: req.body.tags 
}); 

Lo schema si presenta come:

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

E quando si tratta di risparmiare è solo un semplice:

newPerson.save(function(err) { 
    //basic return of json 
}); 

Quindi, utilizzando Postman i inviare in un array nel corpo - tuttavia ogni volta che posso controllare la DB, mostra solo una voce con l'array nel suo complesso vale a dire come ho mandata:

enter image description here

Tutte le idee che extra dovrei fare?

+2

funziona? - 'var personSchema = new mongoose.Schema ({ tags: [{type: String}] });' –

+0

no - come sotto non funziona – userMod2

+0

Che dire solo: 'var personSchema = new mango.Schema ({ tags : [String] }); ' –

risposta

17

Scrivi dal mio commento:

Il modo per specificare un array di stringhe in mangusta è in questo modo:

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

Tuttavia, il problema qui è più-probabile che fare con Postman in quanto sta inviando la 'matrice' come una stringa. È possibile controllare questo controllando il tipo di req.body.tags in questo modo:

console.log(typeof req.body.tags) 

Se questo restituisce una stringa, assicurarsi di impostare il tipo di contenuto in Postman a JSON come si vede nella this screenshot piuttosto che il default 'form- opzione dei dati.

+0

Il problema è con Postman che non considera il mio array come una matrice ma piuttosto una stringa – userMod2

+0

il tipo lo risolverà. Puoi sempre inserirlo in un oggetto e inviarlo come oggetto JSON. –

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

Utilizzare questo nello schema.

Salvare l'Array:

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

Non c'è fortuna con quello – userMod2

+0

Grazie @Siddharth Ajmera –

+0

@ userMod2 Invia anche altri codici in quel caso perché il problema dello schema non dovrebbe esserci. In realtà uso Express Mongoose (Mongo) e ho usato un sistema simile. –

1

Prova a cambiare lo schema per

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

oppure è possibile utilizzare il tipo misto

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

EDIT

penso che il problema sia con l'assegnazione. Usa:

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

se nessuno dei due ha funzionato – userMod2

+0

se questo non ha funzionato, penso che il problema sia da un'altra parte, non nello schema –

0

In primo luogo, come molte persone hanno notato, lo schema deve essere modificato per indicare che il campo tags è destinato a contenere un array di stringhe e non solo un singolo. In modo che ha la necessità di cambiare per:

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

L'altra cosa che dovete tenere a mente (e che mi ha causato un sacco di problemi), è che durante il salvataggio, assicurarsi di utilizzare un array fresco per il campo tags .Ad esempio, questo no lavoro:

person.tags[0] = "new tag"; 
person.save(); 

Invece, è necessario fare qualcosa di simile:

person.tags = person.tags.slice(); // Clone the tags array 
person.tags[0] = "new tag"; 
person.save(); 

Spero che questo aiuti.

+0

Non è necessario suddividere l'array. Mongoose ha integrato metodi per aggiungere elementi alla matrice di un documento. usare '.push()' funzionerà bene. Vedi qui http://mongoosejs.com/docs/api.html#types-array-js –

0

Definire uno schema:

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

In postino aggiungere ogni elemento separatamente utilizzando la sintassi di matrice sotto

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

Restituisci dati:

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