web-dev-qa-db-fra.com

Mongoose - Sauvegarde un tableau de chaînes

Je ne peux pas enregistrer un tableau de chaînes dans ma base de données en utilisant Mongoose.

(Notez que tout le code ci-dessous est simplifié pour faciliter l'écriture ici)

Donc, je déclare une variable d'un schéma de personne que j'ai:

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

Le schéma lui-même ressemble à:

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

Et quand il s’agit d’économiser, c’est simple:

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

Donc, en utilisant Postman, j’envoie un tableau dans le corps - cependant, chaque fois que je vérifie la base de données, il affiche simplement une entrée avec le tableau dans son ensemble, c’est-à-dire comment je l’ai envoyé:

 enter image description here

Des idées de ce que je suis supposé faire?

11
userMod2

Écris mon commentaire: 

La façon de spécifier un tableau de chaînes dans mangouste est comme suit:

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

Cependant, le problème ici est le plus susceptible de se poser avec Postman car il envoie le "tableau" sous forme de chaîne. Vous pouvez vérifier cela en vérifiant le type de req.body.tags comme ceci:

console.log(typeof req.body.tags)

Si cela renvoie une chaîne, assurez-vous de définir le type de contenu dans Postman sur JSON, comme indiqué dans this screenshot plutôt que l'option par défaut «Données de formulaire».

31
Ashley B

Essayez de changer le schéma en

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

ou vous pouvez utiliser le type mixte

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

MODIFIER

je pense que le problème est avec cession. Utilisation:

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

Tout d'abord, comme beaucoup de personnes l'ont noté, le schéma doit être modifié pour indiquer que le champ tags est destiné à contenir un tableau de chaînes, et pas seulement un seul. Donc, cela doit changer à:

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

L'autre chose à garder à l'esprit (et qui m'a causé beaucoup de problèmes) est que, lors de la sauvegarde, veillez à utiliser un nouveau tableau pour le champ tags. Par exemple, ceci ne sera pas travail:

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

Au lieu de cela, vous devez faire quelque chose comme:

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

J'espère que cela t'aides.

1
Harikrishna R

Définir un schéma:

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

Dans postman, ajoutez chaque élément séparément en utilisant la syntaxe de tableau ci-dessous

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

Données de retour:

{
    "__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}]
});

Utilisez ceci dans le schéma. 

Sauver le tableau:

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
Gandalf the White