web-dev-qa-db-fra.com

Comment enregistrer un tableau d'objets à Mongoose DB avec un seul appel?

Y a-t-il un moyen de sauvegarder un tableau d'objet JSON à un Mongodb avec seulement n appel? quelque chose comme:

schemeObject.save(array_of_json_object, callback);

J'utilise mongoosejs

17
jAckOdE

Je ne pense pas que c'est possible avec Mongooosejs. Vous pouvez toutefois utiliser l'insert de lot de MongoDB, qui est soutenu de manière native.

Liens utiles:

http://www.mongodb.org/display/docs/inserting#inserting-bulkinserts

https://groups.google.com/forum/#!msg/mongoose-orm/ikpmvcd0kds/bzuycn_orckj

9
DhruvPathak

Il y a un moyen d'insertion de lots avec Mongoosejs. Je ne sais pas si c'est une nouvelle fonctionnalité car cette question a été posée/réponse, mais je pensais que si quelqu'un viendrait venir ici d'une recherche, ils devraient connaître la manière de le faire.

var array = [{ type: 'Jelly bean' }, { type: 'snickers' }];
Candy.create(array, function (err, jellybean, snickers) {
  if (err) // ...
});

Voici les documents: http://mongoosejs.com/docs/api.html#model_model.create

32
Dan Mandle

Cela fonctionne aussi avec la mangouste

Laptop.insertMany(laptopData, function (err, laptop) {
  if (err) {
    console.log(err);
  };
  console.log(laptop);
});
1
Admir

Une autre solution que j'ai utilisée. Si vous utilisez la mangouste avec des promesses, vous pouvez le faire en utilisant Q .

Vous pouvez commencer à utiliser Q en tant que promesse par défaut pour la mangouste à l'aide du code ci-dessous:

const mongoose = require('mongoose');
mongoose.Promise = require('q').Promise;

Ensuite, vous pouvez enregistrer un tableau de documents comme ci-dessous. Disons que nous stockons un tableau de modèles utilisateur, que j'ai montré dans users variable.

Q
  .all(users.map(curr => curr.save()))
  .then((results) => { //do something })
  .catch((err) => { //handle error })

.save() Retournera un q promesses et utilisera le tableau map fonction, nous créerons une matrice de promesse à l'aide du tableau Modèles utilisateur.

0
Deepal

Que diriez-vous quelque chose comme ça? Je sais que ça boucle à travers l'ensemble de la matrice .. Ne me pose plus de questions sur le Big O pour cela. Probablement pas le meilleur moyen d'insérer mais fonctionne pour une seule version initiale de données.

var arr = // array of objects;
    res = [];

arr.forEach(function (item) {
    item.save(function (err) {
        res.Push(err);
        if (res.length === arr.length)
        {
            // Done
        }
    });
});
0
Anand Nandakumar