articles: [
{
_id: {
type: ObjectId,
ref: "Article"
},
amount: {
type: Number
}
}
]
想法是找出数组中是否存在文章,如果是,则增加数量,否则将值推入数组。
目前,我使用以下代码,但我确定只需使用一个 findandupdate 即可。
function(warehouse, article, amount) {
Warehouse.findOne({
_id: warehouse,
"articles._id": article
})
.then(function(found) {
if (found) {
return Warehouse.findOneAndUpdate(
{
_id: warehouse,
"articles._id": article
},
{
$inc: { "articles.$.amount": amount }
}
);
}
return Warehouse.findOneAndUpdate(
{
_id: warehouse
},
{
$push: {
articles: {
_id: article,
amount: amount,
serialized: false
}
}
}
);
})
修改
我使用了Neil建议,因为我不需要从此查询返回的文档。
所以这是批量写:
Warehouse.bulkWrite(
[
{
updateOne: {
filter: { _id: warehouse, "articles._id": article },
update: {
$inc: {
"articles.$.amount": amount
}
}
}
},
{
updateOne: {
filter: { _id: warehouse },
update: {
$addToSet: {
articles: {
_id: article,
amount: amount,
serialized: true
}
}
}
}
}
],
不知何故,第二次更新总是被执行,即使它是$ addToSet。有关如何避免这种行为的任何想法?
答案 0 :(得分:0)
我使用了Neil Lunn的建议,因为我不需要从此查询中返回的文档。
所以这是批量写:
Warehouse.bulkWrite(
[
{
updateOne: {
filter: { _id: warehouse, "articles._id": article },
update: {
$inc: {
"articles.$.amount": amount
}
}
}
},
{
updateOne: {
filter: { _id: warehouse,
"articles._id": { $exists: false }},
update: {
$addToSet: {
articles: {
_id: article,
amount: amount,
serialized: true
}
}
}
}
}
],
不知何故,第二次更新总是被执行,即使它是$ addToSet,这就是我添加过滤器的原因:" articles._id":{$ exists:false}。有关如何避免这种行为的任何想法?