2016-12-10 1 views
0

ci-dessous mes données de collecte de userpricingComment puis-je calculer le prix prix positif et négatif en utilisant mongodb ou robomongo?

{ 
    "_id" : ObjectId("584bc9ba420a6b189c510af6"), 
    "user_id" : 1, 
    "mobilenumber":"", 
    "price" : 2000.0, 
    "type" : "credit", 

}, 
{ 
    "_id" : ObjectId("584bc9ba420a6b189c510af6"), 
    "user_id" : 1, 
    "mobilenumber":"", 
    "price" : -1000.0, 
    "type" : "credit", 

}, 
{ 
    "_id" : ObjectId("584bc9ba420a6b189c3323w23"), 
    "user_id" : 2, 
    "mobilenumber":"04321", 
    "price" : 1000.0, 
    "type" : "credit", 

} 

ici je veux calculer le prix total négatif postive et total de tous les utilisateurs et je dois vérifier si cet utilisateur est existe ou non en résumé collection.if enregistrement existe pas que nous besoin de créer un document dans la collecte sommaire si elle existe, nous devons mettre à jour « Totalpositiveprice », « Totalnegativeprice » et « Balanceprice »

dans le tableau récapitulatif existe déjà ce disque

{ 

     "user_id": "1", 
     "mobilenumber":"", 
     "Totalpositiveprice": 3000.0, 
     "Totalnegativeprice": 0, 
     "Balanceprice": 3000.0 
    }, 
    { 

     "user_id": "3", 
     "mobilenumber":"05555", 
     "Totalpositiveprice": 1000.0, 
     "Totalnegativeprice": -100, 
     "Balanceprice": 900.0 
    } 
  1. nous avons besoin de mettre à jour le document pour "numéro de téléphone portable": "",

  2. nous avons besoin de créer un nouveau document "numéro de téléphone portable": "04321",

  3. "numéro de téléphone portable": "05555 "pas besoin de faire quoi que ce soit bcoz rien est là dans userpricing

enfin je devrais obtenir la collecte sommaire comme celui-ci

{ 

     "user_id": "1", 
     "mobilenumber":"" 
     "Totalpositiveprice": 5000.0, 
     "Totalnegativeprice": -1000.0, 
     "Balanceprice": 4000.0 
    }, 
    { 

     "user_id": "2", 
     "mobilenumber":"04321" 
     "Totalpositiveprice": 1000.0, 
     "Totalnegativeprice": 0, 
     "Balanceprice": 1000.0 
    }, 
    { 

    "user_id": "3", 
    "mobilenumber":"05555", 
    "Totalpositiveprice": 1000.0, 
    "Totalnegativeprice": -100, 
    "Balanceprice": 900.0 
} 
+0

si le solde signifie somme tous les prix de 1 utilisateur, que vous avez une réponse ci-dessous – sergiuz

+1

double possible de [somme conditionnelle $ à MongoDB] (http://stackoverflow.com/questions/14102596/conditional-sum- in-mongodb) – styvane

+0

environ similaire mais il/elle voulait également exporter dans une autre collection –

Répondre

0

Vous pouvez écrire en vrac en vrac télécharger les requêtes de mise à jour créées à partir du résultat de l'agrégation et de mettre à jour la collection summary.

Voici un code rapide que vous pouvez essayer à partir de Mongo shell et vous pouvez vous adapter à vos besoins.

Le code ci-dessous interroge user_id et incrémente les valeurs de prix en fonction des valeurs d'agrégation et des upsert si aucun id_utilisateur correspondant n'est trouvé.

Vous devez modifier le batch en fonction de vos besoins.

var bulk = db.getCollection('summary').initializeUnorderedBulkOp(); 
var count = 0; 
var batch = 1; 

db.getCollection('userpricing').aggregate([ 
    {$group: { 
     _id:"$user_id", 
     Totalpositiveprice:{$sum:{$cond:[{ '$gt': ['$price', 0]}, "$price", 0]}}, 
     Totalnegativeprice:{$sum:{$cond:[{ '$lt': ['$price', 0]}, "$price", 0]}}, 
     Balanceprice:{"$sum":"$price"}} 
    }, 
    {$project: {_id:0, user_id:"$_id", Totalpositiveprice:1, Totalnegativeprice:1, Balanceprice:1}} 
]).forEach(function(doc){ 
    var user_id = doc.user_id; 
    var totalpositiveprice = doc.Totalpositiveprice; 
    var totalnegativeprice = doc.Totalnegativeprice; 
    var balanceprice = doc.Balanceprice; 
    bulk.find({ "user_id" : user_id }).upsert().updateOne(
     { $inc: {"Totalpositiveprice" : totalpositiveprice, "Totalnegativeprice" : totalnegativeprice, "Balanceprice" : balanceprice } } 
    ); 
    count++; 
    if (count == batch) { 
     bulk.execute(); 
     bulk = db.getCollection('summary').initializeUnorderedBulkOp(); 
     count = 0; 
    } 
}); 

if (count > 0) { 
     bulk.execute(); 
} 
+0

son ne fonctionne pas dans cmd (im utilisant mlb et je suis connecté via cmd) –

+0

J'utilisais le nom de collection incorrect. Fixé dans la réponse. Essayez à nouveau et voir si cela fonctionne. Si ce n'est pas le cas, fournissez l'erreur que vous obtenez avec le code mis à jour. Remarque Je suis en train de regrouper sur l'ID utilisateur au lieu du numéro de mobile. S'il vous plaît ajouter plus de détails. Veuillez vous assurer que vous utilisez des valeurs numériques dans les deux collections. – Veeram

+0

son fonctionnement mais userid je reçois 2.0. { "_id": ObjectId ("58f750889a8a92e6286b91af"), "user_id": 2.0, "Totalpositiveprice": 1000,0, "Totalnegativeprice": 0.0, "Balanceprice": 1000,0 } –

1

Vous pouvez le faire en utilisant conditional sum et à l'exportation dans un autre recueil $out: collectionName

peut essayer:

db.getCollection('userpricing').aggregate([ 
    {$group: { 
     _id:"$user_id", 
     user_id: {$first: "$user_id"}, 
     Totalpositiveprice:{$sum:{$cond:[{ '$gt': ['$price', 0]}, "$price", 0]}}, 
     Totalnegativeprice:{$sum:{$cond:[{ '$lt': ['$price', 0]}, "$price", 0]}}, 
     Balanceprice:{"$sum":"$price"}} 
    }, 
    {$project: {_id:0, user_id:1, Totalpositiveprice:1, Totalnegativeprice:1, Balanceprice:1}}, 
    {$out: "summary"} 
]) 

NB: résultat exporté dans résumé collection

+0

s'il vous plaît vérifier ma question et aidez-moi –

+0

{ "user_id": "1", "Totalpositiveprice": "5000.0", "Totalnegativeprice": "-1000" , "Balanceprice": "4000.0" } –

+0

pouvez-vous s'il vous plaît aidez-moi @Shaishab Roy –

-1

Comme d'autres réponses , le problème avec $out est qu'il va remplacer la collection summary si elle existe et vous ne pouvez pas vouloir cela. Vous pouvez utiliser un peu de JavaScript pour cela.

var cursor = db.userpricing.aggregate([ 
    { 
    $group : { 
     _id : "$user_id", 
     Totalpositiveprice : { 
     $sum : { 
      $cond : { 
      if: { $gte : ["$price" , 0]}, 
      then : "$price", 
      else : 0 
      } 
     } 
     }, 
     Totalnegativeprice : { 
     $sum : { 
      $cond : { 
      if: {$lte : ["$price" , 0]}, 
      then : "$price", 
      else : 0 
      } 
     } 
     }, 
     Balanceprice : {$sum : "$price"} 
    } 
    }, 
    { 
    $project : { 
     _id : 0, 
     user_id : "$_id", 
     Totalpositiveprice : 1, 
     Totalnegativeprice : 1, 
     Balanceprice : 1 
    } 
    } 
]); 

while(cursor.hasNext()) { 
    var elem = cursor.next(); 
    db.summary.update(
    {user_id : elem.user_id}, 
    elem, 
    {upsert : true} 
); 
} 



> db.summary.find() 
{ "_id" : ObjectId("58564bb71e2cb47f2ddcf1b4"), "Totalpositiveprice" : 10000, "Totalnegativeprice" : 0, "Balanceprice" : 10000, "user_id" : 2 } 
{ "_id" : ObjectId("58564bb71e2cb47f2ddcf1b5"), "Totalpositiveprice" : 20000, "Totalnegativeprice" : -10000, "Balanceprice" : 10000, "user_id" : 1 } 
+0

son travail, mais pour l'ID utilisateur 1 je devrais obtenir comme ceci { "user_id": "1", "Totalpositiveprice": " 5000.0 ", " Totalnegativeprice ":" -1000 ", " Balanceprice ":" 4000.0 " } –

+0

@itsme:' user_id' et les valeurs de votre collection 'userpricing' sont des entiers/nombres. Cependant, dans votre collection de résumé, ce sont des chaînes. Si c'est le scénario réel dans votre base de données, alors vous devrez faire des conversions. – ares

1

Tout ce que vous voulez faire implique une requête complexe. Voir la requête ci-dessous. Laissez-moi l'expliquer en premier.

1- premier pipeline $group est évident pour vous.

Le pipeline de 2 secondes $lookup est nécessaire pour générer le résultat souhaité à votre guise, afin que les prix actuels et les prix déjà résumés soient compilés en un seul document.

3- troisième étape est juste de dérouler le tableau summary nous avons cherché afin que nous serons en mesure de compiler les prix.

4- quatrième $project étape fait ce que vous voulez vraiment faire c'est de dire que c'est en compilant le document de synthèse que vous pourrez le comprendre.

5- de générer la collection de récapitulatifs.

db.getCollection('userpricing').aggregate([ 
    {$group:{ 
      _id:"$user_id", 
      Totalpositiveprice:{$sum:{$cond:{if:{ $gt:["$price",0]}, then: "$price", else: 0}}}, 
      Totalnegativeprice:{$sum:{$cond:{if:{ $lt:["$price",0]}, then: "$price", else: 0}}}, 
      Balanceprice:{"$sum":"$price"} 
    }}, 
    { 
     $lookup: 
     { 
      from: "summary", 
      localField: "_id", 
      foreignField: "user_id", 
      as: "summary" 
     } 
    }, 
    {$unwind:{path:"$summary", preserveNullAndEmptyArrays:true}}, 
    {$project:{ 
     _id:0, 
     user_id:"$_id", 
     Balanceprice:{$add:["$Balanceprice", {$cond:{if:{ $eq:["$summary",undefined]}, then: 0, else: "$summary.Balanceprice"}}]}, 
     Totalnegativeprice:{$add:["$Totalnegativeprice", {$cond:{if:{ $eq:["$summary",undefined]}, then: 0, else: "$summary.Totalnegativeprice"}}]}, 
     Totalpositiveprice:{$add:["$Totalpositiveprice", {$cond:{if:{ $eq:["$summary",undefined]}, then: 0, else: "$summary.Totalpositiveprice"}}]} 
    }}, 
    {$out:"summary"} 
]) 
+0

@Si moi, si cela résout votre problème alors, vous devriez commenter ici c'est comment je vais être assuré que j'ai donné la bonne solution. – nurulnabi