2016-02-19 24 views
5

Ich kann nicht scheinen, ein Array von Strings in meine DB mit Mungo zu speichern.Mongoose - Save Array von Strings

(Beachten Sie alle folgenden Code wird für eine einfache vereinfachte hier schreiben)

So erkläre ich eine Variable von einer Person Schema I haben:

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

Das Schema selbst wie folgt aussieht:

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

Und wenn es darum geht, nur ein einfaches zu speichern:

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

Postman Also mit i im Körper in einem Array senden - aber jedes Mal wenn ich die DB zu überprüfen, es einen Eintrag nur mit dem Array zeigt als Ganze also, wie ich ihm geschickt:

enter image description here

Irgendwelche Ideen Was für ein Extra soll ich machen?

+2

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

+0

Nö - wie unten funktionierte nicht – userMod2

+0

Was ist nur: 'var personSchema = new mongoose.Schema ({ Tags : [String] }); ' –

Antwort

17

Schreiben von meinem Kommentar:

Die Art und Weise ein Array von Strings in Mungo zu spezifizieren ist etwa so:

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

Allerdings ist das Problem hier am meisten wahrscheinlich tun Sie mit Postman, wie es das 'Array' als Zeichenfolge sendet. Sie können dies durch die Art der req.body.tags wie so Überprüfung:

console.log(typeof req.body.tags) 

Wenn dies einen String zurückgibt, stellen Sie sicher, den Content-Type in Postman zu JSON setzen, wie in this Screenshot statt der Standard ‚gesehen form- Datenoption.

+0

Das Problem ist, mit Postman nicht mein Array als Array, sondern eine Zeichenfolge – userMod2

+0

In der Tat, hoffentlich die Einstellung der Inhalte- Typ wird es beheben. Sie können es immer innerhalb eines Objekts auffüllen und es als JSON-Objekt senden. –

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

Verwenden Sie dies im Schema.

Speichern des 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

Kein Glück damit – userMod2

+0

Danke @Siddharth Ajmera –

+0

@ userMod2 Veröffentlichen Sie auch andere Codes in diesem Fall, weil Schema-Problem nicht da sein sollte. Ich benutze Express Mongoose (Mongo) und habe ein ähnliches System benutzt. –

1

Versuchen Sie, das Schema zu

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

oder Sie können mithilfe dieser Art verwenden

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

EDIT

Ich denke, das Problem liegt bei der Zuweisung. Verwendung:

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

keiner von denen arbeitete – userMod2

+0

wenn das nicht funktioniert dann denke ich, das Problem ist woanders, nicht im Schema –

0

Erstens, wie viele Leute bemerkt haben, muss das Schema geändert werden, um anzuzeigen, dass das Feld tags ein Array von Strings enthalten soll, und nicht nur ein einzelnes. So muss das ändern:

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

Die andere Sache, die Sie im Auge behalten müssen (und das hat mir eine Menge Ärger), ist, dass beim Speichern, vergewissern Sie sich ein frisches Array für das tags Feld verwenden .Zum Beispiel diese wird nicht Arbeit:

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

Stattdessen müssen Sie so etwas wie zu tun:

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

Hoffnung, das hilft.

+0

Es ist nicht erforderlich, das Array zu zerlegen. Mongoose hat Methoden eingebaut, um dem Array eines Dokuments Elemente hinzuzufügen. mit '.push()' funktioniert gut. Siehe hier http://mongoosejs.com/docs/api.html#types-array-js –

0

ein Schema definieren:

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

In Postbote jedes Element hinzufügen separat die Array-Syntax unter

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

Return Daten:

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