【发布时间】:2014-10-30 06:05:05
【问题描述】:
我正在看这篇关于 MongoDb 中自动递增字段的文章。 http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/
这在理论上看起来不错,但在我的所有数据库调用都是异步的应用程序中不起作用。 Ps,我正在使用 Mongoskin。 考虑一下:
var getNextSequence function (name) {
db.counters.findAndModify({_id: 'invoiceNr'}, {}, {$inc: {seq: 1}}, {new: true}, function(err, doc) {
if (err) {
return next(err);
}
return doc.seq;
});
};
var seq = getNextSequence('invoiceNr');
console.log(seq);
这个(Console.log)在执行时当然不会有任何价值......
这让我想到了嵌套回调(经典的 Node 风格):
db.counters.findAndModify({_id: 'invoiceNr'}, {}, {$inc: {seq: 1}}, {new: true}, function(err, doc) {
if (err) {
return next(err);
}
var seq = getNextSequence('invoiceNr');
// Do something with the seq, like using it when inserting another document.
});
这对于一个文档来说可以正常工作,但是如果我进行批量插入(传递要插入的多个文档的数组),我看不出这将如何工作。我需要批量插入。
回到循环和单次插入似乎不是一个好的解决方案。
你有什么好的解决办法吗?
【问题讨论】:
-
获取自定义
_id值通常不是一个好主意,除非您有一个非常好的案例。但是“批量”对您意味着什么?您是否始终知道要“批量”插入多少个文档?或者你至少可以吗? -
这不适用于 _id 字段,但我知道它仍然会产生同样的问题。这是为了增加发票编号。有人告诉我,人们比我更喜欢会计,这非常可取。批量插入:docs.mongodb.org/manual/core/bulk-inserts 我可能会插入 5 到 500 个文档。
-
但是您确实知道您事先处理的金额对吗?所以你不是从一个流中处理,如果你是,那么你仍然有可能在执行之前知道项目的数量?这基本上就是我要澄清的内容。您还想要“批量 API”表单吗?这在 mongoskin 中可能看起来并不简单,但这是可能的。
-
我总是知道要插入的项目数量是的。我想要的是获取发票对象的数组(长度已知)并将其提供给 db.invoices.insert。我希望那里的所有发票对象都有一个递增的 invoiceNr 字段。
-
我现在可能正在寻找解决方案...午餐和思考时间是件好事 :)
标签: javascript node.js mongodb mongoskin