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é:
Des idées de ce que je suis supposé faire?
É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».
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");
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.
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"
]
}
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);
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
}