1

私は、すべてのユーザーのユーザー統計を更新するために集計フレームワークを使用しています。これは約 50k で、そのうち 30k に少なくとも 1 つの注文が配信されています。

今私が使用しているクエリは

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 を示しています。

また、私が正しければ、バルクサイズを変更しても同じクエリの更新操作の数は同じままである必要がありますが、600 の場合は 413、1000 の場合は 613.

説明できますか ?

4

0 に答える 0