2016-02-10 3 views
1

Je voudrais votre avis sur le processus i mis en place:MongoDB joindre/mise à jour

J'ai deux collections:

Clients: {client_id, client_type}

Ordres: {ORDER_ID, client_id, order_amount, order_valid}

Basé sur ces collections, je voudrais calculer, entre autres, le nombre d'ordres valides par type de client.

Je voudrais joindre les deux collections et ajoutez le client_type dans ma collection de commandes

Je l'ai fait de cette façon, mais je ne trouve pas cette solution très efficace.

db.clients.find (
    {}, 
    { 
     client_id : 1, 
     client_type : 1 
    } 
).forEach(function (pClient) { 

    db.orders.update (
     { 
      client_id : pClient.client_id 
     }, 
     { $set : { 
      client_type : pClient.client_type 

     }}, 
     { 
      multi : true 
     } 
    ) 
}); 

Avez-vous une idée de la façon d'améliorer ce processus?

+0

Il est préférable de tout mettre dans un seul document. {Identité du client; Type de client, {Identifiant de la commande, Montant de la commande, Commande valide}}. Ensuite, vous pouvez simplement utiliser le cadre agrégé. – Orejano

+0

Les collections Orders et Clients sont chargées à partir de fichiers externes, je ne peux pas le faire. – Mouette

+1

Si vous utilisez MongoDB 3.2 ['$ lookup'] (https://docs.mongodb.org/manual/reference/operator/aggregation/lookup/#pipe._S_lookup), effectuez une jointure externe gauche vers une autre collection dans la même base de données pour filtrer dans les documents de la collection "jointe" pour traitement. – chridam

Répondre

0

Ainsi, c'est la solution la plus rapide que j'ai trouvé:

var bulk = db.orders.initializeUnorderedBulkOp(); 
var bulk_counter = 0; 

db.clients.find (
    {}, 
    { 
     client_id : 1, 
     client_type : 1 
    } 
).forEach(function (pClient) { 
    bulk.find(
     { 
      client_id : pClient.client_id 
     } 
    ).update(
     { $set : { 
      client_type : pClient.client_type 
     }}, 
    ) 

    bulk_counter++; 
    if (bulk_counter % 1000 == 0) 
    { 
     bulk.execute(); 
     bulk = db.m_recipient_indicators.initializeUnorderedBulkOp(); 
     } 
}); 

if (bulk_counter % 1000 != 0) 
{ 
    bulk.execute(); 
}