我有一个问题 - 不确定我做错了什么或者是一个错误。我有一些产品 - 每个产品都有一系列的变化。我想浏览一些数据并将其加载到这些变体中,但我遇到了一些“VersionError:找不到匹配的文档”错误。
以为我有一个竞争条件(我按顺序为我修改的每个变体保存相同的文档)我使用了asyc.eachSeries()但这没有帮助。一次加载导致文档错误的错误不会产生错误,因此它似乎与某些竞争条件有关但我无法追踪它。
架构:
var Product = new Schema({
title: {
type: String,
},
variations: {
type: Array
}
});
示例代码:
// Some data to load - the 'variant' is the index of the variations array above
var records = [{
code: 'foo',
id: '50ba9c647abe1789f7000073',
variant: 0
}, {
code: 'bar',
id: '50ba9c647abe1789f7000073',
variant: 1
}, {
code: 'foobar',
id: '50ba9c647abe1789f7000073',
variant: 2
}];
var iterator = function(item, cb) {
Product.findById(item.id).exec(function(err, product) {
if(err) {
return cb(err);
}
if (product) {
product.variations[item.variant].code = item.code.trim();
product.markModified('variations');
product.save(function(err, p) {
return cb(err);
});
} else {
return cb('Missing product');
}
});
};
async.eachSeries(records, iterator, function(err) {
process.exit(1);
});
答案 0 :(得分:1)
我认为问题在于您如何定义架构。让变体成为自己的模式并让产品模式使用它作为子doc更好。我会改变它看起来像这样:
var Variant = new Schema({
code: String,
})
var Product = new Schema({
title: String,
variants: [Variant]
})
然后你可以像这样记录:
var variants = product.variants
for (i in variants) {
var variant = variants[i]
variant.code = records[i].code
variant.save(function(err) {
...
})
}
答案 1 :(得分:0)
如果在模型Scheme中你使用的是versionKey,那么问题就来了,doc从mongo多次调用,在这种情况下最好的方法是发送doc的所有对象,附近的例子
function getDoc(doc, callback) {
if ( doc instanceof Object && doc._id ) {
callback(null, doc);
} else {
return Doc.findById(doc, callback);
}
}
function updateDoc(doc, data) {
// doc is already model
getDoc(doc, function(err, doc) {
doc.data = data;
doc.save();
});
}