it-swarm.com.de

Mungo - Speichern Sie das String-Array

Ich kann mit Mongoose kein String-Array in meiner Datenbank speichern.

(Beachten Sie, dass der folgende Code hier vereinfacht ist)

Also erkläre ich eine Variable eines Personenschemas, das ich habe:

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

Das Schema selbst sieht folgendermaßen aus:

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

Und wenn es ums Sparen geht, ist es einfach:

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

Mit Postman schicke ich also ein Array in den Rumpf. Bei jeder Überprüfung der Datenbank wird jedoch nur ein Eintrag mit dem Array als Ganzes angezeigt, d. H. Wie ich es gesendet habe:

 enter image description here

Irgendwelche Ideen, was ich extra tun soll?

11
userMod2

Schreibe meinen Kommentar auf: 

So legen Sie ein Array von Strings in mongoose fest:

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

Das Problem hier ist jedoch höchstwahrscheinlich mit Postman zu tun, da es das 'Array' als String sendet. Sie können dies überprüfen, indem Sie den Typ von req.body.tags wie folgt überprüfen:

console.log(typeof req.body.tags)

Wenn dies einen String zurückgibt, stellen Sie sicher, dass Sie den Inhaltstyp in Postman auf JSON setzen, wie in this screenshot und nicht als Standardoption "form-data".

31
Ashley B

Ändern Sie das Schema in

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

oder Sie können gemischte Art verwenden

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

EDIT

ich denke, das Problem liegt in der Zuweisung. Benutzen:

person.tags.Push("string to Push");
3

Erstens muss das Schema, wie viele Leute bemerkt haben, geändert werden, um anzuzeigen, dass das Feld tags ein Array von Strings und nicht nur einen einzelnen String enthalten soll. Das muss sich also ändern in:

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

Die andere Sache, die Sie beachten sollten (und die mir viele Probleme bereitete) ist, dass Sie beim Speichern unbedingt ein neues Array für das Feld tags verwenden. Zum Beispiel ist dies nicht Arbeit:

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

Stattdessen müssen Sie Folgendes tun:

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

Hoffe das hilft.

1
Harikrishna R

Definieren Sie ein Schema:

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

Fügen Sie in Postman jedes Element separat hinzu, indem Sie die folgende Array-Syntax verwenden

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

Rückgabedaten:

{
    "__v": 0,
    "name": "Thing",
    "_id": "5a96e8d0c7b7d1323c677b33",
    "tags": [
        "task",
        "other",
        "thing"
    ]
}
0
Sigkill9
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);
0
Phonix
var personSchema = new mongoose.Schema({
  tags: [{type: String}]
});

Verwenden Sie dies im Schema. 

Speichern des Arrays:

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
  1. Im Schema

    techs: Array

  2. Auf Briefträger

    "techs": ["express","rect","html","css","scss"]

  3. Auf DB (MongoDB)

    "techs" : [ "epxress", "rect", "html", "css", "scss" ]

0
Chawki