如何仅通过一次调用将一组对象保存到猫鼬数据库?

Posted

技术标签:

【中文标题】如何仅通过一次调用将一组对象保存到猫鼬数据库?【英文标题】:How to save an array of objects to mongoose DB with only one call? 【发布时间】:2012-04-16 18:12:19 【问题描述】:

有没有什么方法可以通过 one 调用将 JSON 对象数组保存到 mongodb? 类似:

schemeObject.save(array_of_json_object, callback);

我正在使用mongoosejs

【问题讨论】:

能否更新正确答案? @IcyFlame 从技术上讲,您链接的帖子与这篇文章是重复的。 @DanMandle 对!我没有注意到日期。感谢您指出。 你也可以试试这个:***.com/questions/16726330/… 【参考方案1】:

有一种使用 MongooseJS 批量插入的方法。我不确定这是否是一项新功能,因为有人提出/回答了这个问题,但我想如果有人通过搜索来到这里,他们应该知道如何去做。

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

这里是文档:http://mongoosejs.com/docs/api.html#model_Model.create

【讨论】:

如果我们想创建新文档,这应该可以工作。更新从查询返回的数组或文档怎么样? 为此,我认为您必须对结果执行 find() 然后 forEach() ,更新值并为每个值执行 save() 。但我自己对 Mongoose 还是很陌生。【参考方案2】:

我认为 mongooosejs 不可能。但是,您可以使用本机支持的 ​​mongodb 的 BATCH 插入。

有用的链接:

http://www.mongodb.org/display/DOCS/Inserting#Inserting-Bulkinserts

https://groups.google.com/forum/#!msg/mongoose-orm/IkPmvcd0kds/bZuYCN_orckJ

【讨论】:

答案在第二个链接中找到。谢谢【参考方案3】:

这也适用于猫鼬

Laptop.insertMany(laptopData, function (err, laptop) 
  if (err) 
    console.log(err);
  ;
  console.log(laptop);
);

【讨论】:

【参考方案4】:

这样的事情怎么样?我知道它会遍历整个数组.. 不要问我关于 Big O 的问题.. 可能不是最好的插入方式,但仅适用于某种初始数据转储..

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

arr.forEach(function (item) 
    item.save(function (err) 
        res.push(err);
        if (res.length === arr.length)
        
            // Done
        
    );
);

【讨论】:

如果是一个一个的,那不会是批量插入!【参考方案5】:

我使用的另一种解决方法。如果你使用的是带有 Promise 的猫鼬,你可以使用 Q 来做到这一点。

您可以使用以下代码开始使用 Q 作为 mongoose 的默认承诺:

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

然后您可以保存一组文档,如下所示。假设我们正在存储一个用户模型数组,我在users 变量中显示了这些模型。

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

.save() 将返回一个 q 承诺并使用数组 map 函数,我们将使用用户模型数组创建一个承诺数组。

【讨论】:

【参考方案6】:

我得到了解决方案而不是使用

new model_name(
your data
)

使用这个

model_name.create(your data).then(res).catch(err) 

// 简单的承诺事项

【讨论】:

以上是关于如何仅通过一次调用将一组对象保存到猫鼬数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过一次调用将一组对象推送到猫鼬中的数组中?

如何将json对象数组保存到猫鼬?

如何将json对象数组保存到猫鼬?

循环依赖检测到猫鼬错误

将订单集合中的订单总和添加到猫鼬中的用户集合

将普通对象投射到猫鼬文档