我使用聚合框架来更新所有用户的用户统计信息,大约有 50k,其中 30k 至少交付了一个订单。
现在我使用的查询是
var orderIds = db.delivery.find({"status": "DELIVERED"}).map(function(d){return d.order;}),
counter = 0,
bulk = db.user.initializeUnorderedBulkOp();
var userstatsCursor = db.orders.aggregate([
{ "$match": { "_id": { "$in": orderIds } } },
{
"$group": {
"_id": "$customer",
"orders": { "$sum": 1 },
"firstOrderDate": { "$min": "$dateCreated" },
"lastOrderDate":{ "$max": "$dateCreated" } }
}
}
]);
userstatsCursor.forEach(function (x){
bulk.find({ "_id": x._id }).updateOne({
"$set": {
"totalOrders": x.orders,
"firstOrderDate": x.firstOrderDate,
"lastOrderDate": x.lastOrderDate
}
});
counter++;
if (counter % 500 == 0) {
bulk.execute(); // Execute per 500 operations and
// re-initialize every 500 update statements
bulk = db.user.initializeUnorderedBulkOp();
}
});
// Clean up remaining operations in queue
if (counter % 500 != 0) { bulk.execute(); }
它找到所有已交付的订单,然后获取所有这些客户并更新他们的 firstOrderDate、lastOrderDate 和 totalOrders,但问题是
从文档中它说 nMatched 是更新操作的数量,所以对我来说,我正在更新所有已交付订单的用户,这些订单大约在 30k 左右,但在我的情况下,它显示的数字非常少 113 ,
另外,如果我是对的,即使我更改了批量大小,对于相同的查询,更新操作的数量也应该保持不变,但是对于不同的批量大小,查询会给出不同的 nMatched,例如 600 它给出 413,对于 1000 它给出 613。
你可以解释吗 ?