あなたはそれらを更新して文書構造を変更する必要があります。 .forEach
メソッドを使用して各文書をループする必要があります。$unset
すべてのフィールドの名前は、始まりがproduct_
です。そこから、$set
更新演算子を使用する製品の配列である新しいフィールドproducts
を追加する必要があります。あなたはあなたの文書
var bulkOp = db.collection.initializeOrderedBulkOp();
var count = 0;
db.collection.find().forEach(function(doc) {
var allproducts = [];
for(var key in doc) {
if(Object.prototype.hasOwnProperty.call(doc, key) && /^product_\d+/.test(key)) {
var product = {};
product["name"] = key;
product["orderCancelled"] = doc[key]["orderCancelled"];
product["orderDelivered"] = doc[key]["orderDelivered"];
allproducts.push(product);
var unsetField = {};
unsetField[key] = "";
bulkOp.find({"_id": doc._id}).update({ "$unset": unsetField });
};
count++;
};
bulkOp.find({"_id": doc._id}).update({
"$set": { "products": allproducts }
});
count++;
if(count % 500 === 0) {
// Execute per 500 operations and re-init
bulkOp.execute();
bulkOp = db.collection.initializeOrderedBulkOp();
}
})
// clean up queues
if(count > 0) {
bulkOp.execute();
}
最大効率のためにドキュメントを更新する"bulk"操作を使用する必要があります言われていることは次のようになります:
{
"_id" : NumberLong(542),
"products" : [
{
"name" : "product_1",
"orderCancelled" : 0,
"orderDelivered" : 6
},
{
"name" : "product_2",
"orderCancelled" : 3,
"orderDelivered" : 16
},
{
"name" : "product_3",
"orderCancelled" : 5,
"orderDelivered" : 11
}
]
}
その後、あなたの集計クエリが.aggregate()
メソッドを使用しています:
db.collection.aggregate([
{ "$match": { "_id": 542 } },
{ "$unwind": "$products" },
{ "$group": {
"_id": "$_id",
"maxOrderCancelled": { "$max": "$products.orderCancelled"},
"minOrderDelivvered": { "$min": "$products.orderDelivered"}
}}
])
戻り値:
から
{ "_id" : NumberLong(542), "maxOrderCancelled" : 5, "minOrderDelivvered" : 6 }
あなたがこれを行うにははるかに良い方法があるあなたの$project
段階で$max
と$min
使用することができますので、そこに最初の$unwind
あなたの配列への必要はありません。
{ "_id" : NumberLong(542), "maxOrderCancelled" : 5, "minOrderDelivered" : 6 }
なぜあなたは配列にあなたの製品を入れないでください:利回りは
? –
@DmytroShevchenko私はあなたを得なかった。実際には別のケースでは、 'orderDelivered'のカウントを' product name'で与えることもできます。あなたのケースでデザインはどのようになりますか? – Shams
私の答えにデータ構造の例を見てください。 'orderDelivered'を' product name'で数えることによって何を意味するのかを記述してください。 –