Mongoose创建多个文档

52

我知道在最新版的Mongoose中,你可以将多个文档传递给create方法,或者更好的是在我的情况下传递文档数组。

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

我的问题是数组大小是动态的,所以在回调函数中拥有一个创建的对象数组会很有帮助。

var array = [{ type: 'jelly bean' }, { type: 'snickers' }, ..... {type: 'N candie'}];
Candy.create(array, function (err, candies) {
    if (err) // ...

    candies.forEach(function(candy) {
       // do some stuff with candies
    });
});

文档中没有提到,但类似于这样的操作是否可行?

6个回答

52
您可以通过arguments访问回调函数的参数列表。例如:

Candy.create(array, function (err) {
    if (err) // ...

    for (var i=1; i<arguments.length; ++i) {
        var candy = arguments[i];
        // do some stuff with candy
    }
});

哈哈,完全忘记了。非常感谢。 - lostintranslation

48

使用Mongoose v5.1.5,我们可以使用insertMany()方法并传入数组。

const array = [
    {firstName: "Jelly", lastName: "Bean"},
    {firstName: "John", lastName: "Doe"}
];

Model.insertMany(array)
    .then(function (docs) {
        response.json(docs);
    })
    .catch(function (err) {
        response.status(500).send(err);
    });

11
根据GitHub上的此问题单,在使用create()时,如果您提供一个数组,则Mongoose 3.9和4.0将返回一个数组;如果您提供扩展参数,则返回一组参数。请注意,本文不会提供解释,保留HTML标签。

7
自从 Mongoose v5 版本以后,您可以使用 insertMany 函数。根据 Mongoose 网站 的说明,它比 .create() 函数更快:

如果一个文档数组都有效,则该函数用于验证并将它们插入到 MongoDB 中。与 .create() 函数相比,此函数只向服务器发送一次操作,而不是每个文档都发送一次。

下面是一个完整的示例:
const mongoose = require('mongoose'); 
  
// Database connection 
mongoose.connect('mongodb://localhost:27017/databasename', { 
    useNewUrlParser: true, 
    useCreateIndex: true, 
    useUnifiedTopology: true
}); 
  
// User model 
const User = mongoose.model('User', { 
    name: { type: String }, 
    age: { type: Number } 
}); 


// Function call, here is your snippet
User.insertMany([ 
    { name: 'Gourav', age: 20}, 
    { name: 'Kartik', age: 20}, 
    { name: 'Niharika', age: 20} 
]).then(function(){ 
    console.log("Data inserted")  // Success 
}).catch(function(error){ 
    console.log(error)      // Failure 
});

2

通过集合数据库的insert函数, 例如:

Model.collection.insert(array, (err, list) => {
  if (err) throw err;

  console.log('list:', list);
});

0
默认情况下没有时间戳,因为您直接将其插入到数据库中。
Model.collection.insertOne({}, callback);
Model.collection.insertMany([], callback);

带有时间戳的保存到数据库,接受数组或对象

Model.create([])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接