mongodb php sum

44 views
Skip to first unread message

Eloir Casas

unread,
Aug 9, 2014, 1:39:30 AM8/9/14
to mongod...@googlegroups.com
buenas noches tengo varios dias atorado con el siguiente problema:
Estoy haciendo un POS utilizando mongo y php, el problema es que no encuentro la forma de sumar el precio de todos los articulos en el carrito de venta, he visto varios posts pero ninguno me funciona.

Juan Carlos Farah

unread,
Aug 9, 2014, 5:55:02 AM8/9/14
to mongod...@googlegroups.com

Hola Eloir,

¿Podrías pasar un ejemplo de tus documentos para los carritos de venta? Así podremos ayudarte mejor.

Juan Carlos

On 9 Aug 2014 06:39, "Eloir Casas" <eloir...@gmail.com> wrote:
buenas noches tengo varios dias atorado con el siguiente problema:
Estoy haciendo un POS utilizando mongo y php, el problema es que no encuentro la forma de sumar el precio de todos los articulos en el carrito de venta, he visto varios posts pero ninguno me funciona.

--
Has recibido este mensaje porque estás suscrito al grupo "MongoDB Perú" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a mongodb-lima...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a mongod...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/mongodb-lima.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/mongodb-lima/3349a1bc-95e4-4d46-b471-89baa50fae7f%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Eloir Casas

unread,
Aug 9, 2014, 5:40:34 PM8/9/14
to mongod...@googlegroups.com
Básicamente esto es lo que quiero hacer pero en lugar de mysql utilizar mongodb y php:

SELECT SUM(precio) AS "totalventa"
FROM preventa;

Luis Cordova

unread,
Aug 9, 2014, 5:47:59 PM8/9/14
to mongod...@googlegroups.com


--
Has recibido este mensaje porque estás suscrito al grupo "MongoDB Perú" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a mongodb-lima...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a mongod...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/mongodb-lima.

Eloir Casas

unread,
Aug 9, 2014, 6:02:53 PM8/9/14
to mongod...@googlegroups.com
Muchas gracias eso es lo que requiero pero una duda tengo que poner todos esos scripts? 
porque tanta cosa si solo quiero una suma simple de toda una collection, sin filtros ni nada.

Siempre programe en asp y nada me hacia cambiar a php, hasta que llego mongodb, excelente base datos nosql, mas tarde voy a ir a la oficina y les posteo lo que llevo para ver si alguien conoce una manera simple de realizar esa accion, de ante mano gracias por su ayuda.

Luis Cordova

unread,
Aug 9, 2014, 6:13:47 PM8/9/14
to mongod...@googlegroups.com
no se de que scripts hablas te refieres a libraries?

composer == npm pero en el mundo php

creo que estas acostumbrado a php escrito de la peor calidad, si ese es tu entorno bueno hazlo como ya sabes que es esa forma, pero no asumas que el php es eso




--
Has recibido este mensaje porque estás suscrito al grupo "MongoDB Perú" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a mongodb-lima...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a mongod...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/mongodb-lima.

Juan Carlos Farah

unread,
Aug 9, 2014, 7:02:54 PM8/9/14
to mongod...@googlegroups.com
Hola Eloir, Luis,

No creo que necesitas usar Map/Reduce para calcular la suma de un campo y no es recomendable usar Map/Reduce en un sistema de producción para operaciones en vivo. Si me muestras cómo has modelado tus documentos en "preventa" puedo decir exactamente como hacerlo con el aggregation framework.

Saludos,

Juanca




Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Juan Carlos Farah
Skype. juancarlos.farah
Twitter. juancarlosfarah

Luis Cordova

unread,
Aug 9, 2014, 7:10:18 PM8/9/14
to mongod...@googlegroups.com
si el aggregation framework capaz es mejor, yo no se mucho de mongo


Gildus

unread,
Aug 9, 2014, 10:24:48 PM8/9/14
to mongod...@googlegroups.com
Holas,


SELECT SUM(precio) AS "totalventa"
FROM preventa;

Equivaldria a:

db.preventa.group({
    "initial": {
        "totalventa": 0
    },
    "reduce": function(obj, prev) {
        prev.totalventa = prev.totalventa + obj.precio - 0;
    }
});


Pero seria bueno que uses el doctrine y asi te evitas saber mas de sintaxis mongo y usar solo la capa del doctrine.

Saludos,



Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
El árbol que servirá para imprimir  este  papel, tardará 7 años en crecer. Por favor no imprimas este mensaje si no es necesario.  Recuerda:  “Re-use, Reduzca y Recicle”.

Eloir Casas

unread,
Aug 9, 2014, 11:21:18 PM8/9/14
to mongod...@googlegroups.com
gildus la solucion que me das es el script para utilizarlo en la consola, yo necesito en php, gracias de todas formas y acontinuacion les muestro la estructura que tengo.

1.- esto es el index donde selecciono el articulo a vender:
<?php
require('inc/session.php');
require('inc/user.php');

$user = new User();

if (!$user->isLoggedIn()){
    header('location: login.php');
    exit;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <link rel="stylesheet" href="stylechaton.css" /> 
        <title>Chaton POS - Cajero <?php echo $user->nombreusuario; ?></title>
   <script type="text/javascript">
//Input the IDs of the IFRAMES you wish to dynamically resize to match its content height:
//Separate each ID with a comma. Examples: ["myframe1", "myframe2"] or ["myframe"] or [] for none:
var iframeids=["myframe"]

//Should script hide iframe from browsers that don't support this script (non IE5+/NS6+ browsers. Recommended):
var iframehide="yes"

var getFFVersion=navigator.userAgent.substring(navigator.userAgent.indexOf("Firefox")).split("/")[1]
var FFextraHeight=parseFloat(getFFVersion)>=0.1? 16 : 0 //extra height in px to add to iframe in FireFox 1.0+ browsers

function resizeCaller() {
var dyniframe=new Array()
for (i=0; i<iframeids.length; i++){
if (document.getElementById)
resizeIframe(iframeids[i])
//reveal iframe for lower end browsers? (see var above):
if ((document.all || document.getElementById) && iframehide=="no"){
var tempobj=document.all? document.all[iframeids[i]] : document.getElementById(iframeids[i])
tempobj.style.display="block"
}
}
}

function resizeIframe(frameid){
var currentfr=document.getElementById(frameid)
if (currentfr && !window.opera){
currentfr.style.display="block"
if (currentfr.contentDocument && currentfr.contentDocument.body.offsetHeight) //ns6 syntax
currentfr.height = currentfr.contentDocument.body.offsetHeight+FFextraHeight; 
else if (currentfr.Document && currentfr.Document.body.scrollHeight) //ie5+ syntax
currentfr.height = currentfr.Document.body.scrollHeight;
if (currentfr.addEventListener)
currentfr.addEventListener("load", readjustIframe, false)
else if (currentfr.attachEvent){
currentfr.detachEvent("onload", readjustIframe) // Bug fix line
currentfr.attachEvent("onload", readjustIframe)
}
}
}

function readjustIframe(loadevt) {
var crossevt=(window.event)? event : loadevt
var iframeroot=(crossevt.currentTarget)? crossevt.currentTarget : crossevt.srcElement
if (iframeroot)
resizeIframe(iframeroot.id);
}

function loadintoIframe(iframeid, url){
if (document.getElementById)
document.getElementById(iframeid).src=url
}

if (window.addEventListener)
window.addEventListener("load", resizeCaller, false)
else if (window.attachEvent)
window.attachEvent("onload", resizeCaller)
else
window.onload=resizeCaller

</script>
<script type="text/javascript" src="lib/jquery-1.10.1.min.js"></script>

<!-- Add fancyBox main JS and CSS files -->
<script type="text/javascript" src="source/jquery.fancybox.js?v=2.1.5"></script>
<link rel="stylesheet" type="text/css" href="source/jquery.fancybox.css?v=2.1.5" media="screen" />


<script type="text/javascript">
$(document).ready(function() {
/*
*  Simple image gallery. Uses default settings
*/

$('.fancybox').fancybox();

/*
*  Different effects
*/

// Change title type, overlay closing speed
$(".fancybox-effects-a").fancybox({
helpers: {
title : {
type : 'outside'
},
overlay : {
speedOut : 0
}
}
});

// Disable opening and closing animations, change title type
$(".fancybox-effects-b").fancybox({
openEffect  : 'none',
closeEffect : 'none',

helpers : {
title : {
type : 'over'
}
}
});

// Set custom style, close if clicked, change title type and overlay color
$(".fancybox-effects-c").fancybox({
wrapCSS    : 'fancybox-custom',
closeClick : true,

openEffect : 'none',

helpers : {
title : {
type : 'inside'
},
overlay : {
css : {
'background' : 'rgba(238,238,238,0.85)'
}
}
}
});

// Remove padding, set opening and closing animations, close if clicked and disable overlay
$(".fancybox-effects-d").fancybox({
padding: 0,

openEffect : 'elastic',
openSpeed  : 150,

closeEffect : 'elastic',
closeSpeed  : 150,

closeClick : true,

helpers : {
overlay : null
}
});

/*
*  Button helper. Disable animations, hide close button, change title type and content
*/

$('.fancybox-buttons').fancybox({
openEffect  : 'none',
closeEffect : 'none',

prevEffect : 'none',
nextEffect : 'none',

closeBtn  : false,

helpers : {
title : {
type : 'inside'
},
buttons : {}
},

afterLoad : function() {
this.title = 'Image ' + (this.index + 1) + ' of ' + this.group.length + (this.title ? ' - ' + this.title : '');
}
});


/*
*  Thumbnail helper. Disable animations, hide close button, arrows and slide to next gallery item if clicked
*/



$("#fancybox-manual-b").click(function() {
$.fancybox.open({
href : 'iframe.html',
type : 'iframe',
padding : 5
});
});


});
</script>
<style type="text/css">
.fancybox-custom .fancybox-skin {
box-shadow: 0 0 50px #222;
}

body {
max-width: 0 auto;
margin: 0 auto;
}
</style>
    </head>

    <body>
    <div id="contentarea">
     
            <div id="innercontentarea">
          
              <h1>Cajero - <?php echo $user->nombreusuario; ?> <?php $usuario1 = $user->acceso;
if ($usuario1 == "5")
{
echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="texto15" style="float:center;">*<a href="admin/admin.php">Administracion</a>*';
}
?> <?php $usuario1 = $user->acceso;
if ($usuario1 == "3")
{
echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="texto15" style="float:center;">*<a href="admin/foliosuper.php">Administracion</a>*';
}
?></h1>
                         <hr />

              <ul class="profile-list">

                <li> 
                  <table width="100%" border="0">
  <tr>
    <td width="65%" rowspan="2" valign="top">
   Servicios:<br />
<br />
<?php 
$m = new MongoClient("mongodb://127.0.0.1:27117");
$db = $m->ace;
$collection = $db->ss_chaton_articulos;
$where=array('tipo' => 'servicio', 'qty' => array('$gt'=>'0'));
$cursor = $collection->find($where);
foreach ($cursor->sort(array('articulo' => 1)) as $document) {
?>
    <a class="fancybox fancybox.iframe" href="venta.php?id=<?php echo $document["_id"] ?>"><img src="<?php echo $document["img_url"] ?>" width="<?php echo $document["img_y"] ?>" height="<?php echo $document["img_x"] ?>" /></a>

<?php } ?>
<br />
<br />
 Articulos:<br />
<br />
<?php 
$m = new MongoClient("mongodb://127.0.0.1:27117");
$db = $m->ace;
$collection = $db->ss_chaton_articulos;
$where=array('tipo' => 'articulo', 'qty' => array('$gt'=>'0'));
$cursor = $collection->find($where);
foreach ($cursor as $document) {
?>
   <img src="<?php echo $document["img_url"] ?>" width="<?php echo $document["img_y"] ?>" height="<?php echo $document["img_x"] ?>" />
 
<?php } ?>


</td>
      
      
      
    <td width="35%" valign="top">*<br />
<iframe id="myframe" name="myframe" src="checkout.php" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" vspace="0" hspace="0" style="overflow:visible; width:100%; display:none"></iframe></td>
  </tr>
  <tr>
    <td width="35%" valign="middle">&nbsp;</td>
  </tr>
                  </table>
                    </li>
                    <li></li>
                </ul>

            
      </div>
      <?php require('footer.php'); ?>
        </div>
    </body>
</html>

2.- este es el pop up window donde se recogen los valores del articulo seleccionado:
<?php
require('inc/session.php');
require('inc/user.php');

$user = new User();

if (!$user->isLoggedIn()){
    header('location: login.php');
    exit;
}
?>
<link rel="stylesheet" href="stylechaton.css" /> 

    <div id="contentarea">
     
            <div id="innercontentarea">
          
              <h1>Venta</h1>
                         <hr />

              <ul class="profile-list">

                <li> 
                  <table width="100%" border="0">
  <tr>
    <form id="form1" name="form1" method="post" action="checkout.php" target="myframe" />
      <td width="21%" valign="top"><br />
        <?php 
$m = new MongoClient("mongodb://127.0.0.1:27117");
$db = $m->ace;
$collection = $db->ss_chaton_articulos;
$where=array('_id' => new MongoId($_GET["id"]));
$cursor = $collection->find($where);
foreach ($cursor as $document) {
?>
     <center>  <img src="<?php echo $document["img_url"] ?>" width="<?php echo $document["img_y"] ?>" height="<?php echo $document["img_x"] ?>" />
       <br>
        <?php echo $document["articulo"] ?>
       <br>
       </center>
       <?php } ?>
  <br />
  <br /></td>
      <td width="79%" valign="middle"><span class="listadotitle">
      <input name="articulo" type="hidden" value="<?php echo $document["articulo"] ?>">
      <input name="tipo" type="hidden" value="<?php echo $document["tipo"] ?>">
      <input name="id" type="hidden" value="<?php echo $document["_id"] ?>">
      <input name="img" type="hidden" value="<?php echo $document["img_url"] ?>">
      <input name="cajero" type="hidden" value="<?php echo $user->nombreusuario; ?>">
      <input name="notas" type="hidden" value="0">
      <input name="status" type="hidden" value="active">
      <input name="precio" type="hidden" value="<?php echo $document["venta"] ?>">
      Tiempo:</span><select name="tiempo" class="listadotitle" id="tiempo">
  <option value="30" selected="selected">30</option>
  <option value="60">60</option>
  <option value="90">90</option>
  <option value="120">120</option>
  <option value="150">150</option>
  <option value="180">180</option>
</select> &nbsp;&nbsp;&nbsp; <input name="agregar" type="submit" class="title" value="Agregar" onClick="parent.$.fancybox.close();" ></td>
    </form>
    
    </tr>
                  </table>
                    </li>
                    <li></li>
                </ul>

            
      </div>
    
        </div>


3.- este es el del problema donde no se como sumar los valores de los articulos agregados previamente:
<?php
require('inc/session.php');
require('inc/user.php');

$user = new User();

if (!$user->isLoggedIn()){
    header('location: blank.php');
    exit;
}
      $m = new MongoClient("mongodb://127.0.0.1:27117");
?>
 <?php 
if (isset($_POST["agregar"])) {
$m = new MongoClient("mongodb://127.0.0.1:27117");
$db = $m->ace;
$collection2 = $db->ss_chaton_articulos_temp;
$preciod = $_POST['precio'];
$tiempod = $_POST['tiempo'];
if ($tiempod = '30')
{
$preciod1 = $preciod;
}
else if ($tiempod = '60')
{
$preciod1 = $preciod * 2;
}
try{
$collection2->insert( array( 'articulo' => $_POST['articulo'], 'tipo' => $_POST['tipo'], 'id' => $_POST['id'], 'cajero' => $_POST['cajero'], 'tiempo' => $_POST['tiempo'], 'precio' => $preciod1, 'img' => $_POST['img'], 'notas' => $_POST['notas'], 'status' => $_POST['status'], 'vendido' => time()));
 } catch (MongoCursorException $e)
    {
        die($e->getMessage());
    }
?>
<?php 
if (isset($_POST["eliminar"])) {
$m = new MongoClient("mongodb://127.0.0.1:27117");
$db = $m->ace;
$collection3 = $db->ss_chaton_articulos_temp;
try{
$collection3->remove( array( '_id' => new MongoID($_POST['id']) ) );
 } catch (MongoCursorException $e)
    {
        die($e->getMessage());
    }
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <link rel="stylesheet" href="stylechatoncheck.css" /> 
        <title>checkout</title>

    </head>

    <body>
    <div id="contentarea">
     
            <div id="innercontentarea">
          
              <h1>Venta:</h1>
              <ul class="profile-list">
                 <?php 
$m = new MongoClient("mongodb://127.0.0.1:27117");
$db = $m->ace;
$collection = $db->ss_chaton_articulos_temp;
$cursor = $collection->find();
foreach ($cursor->sort(array('articulo' => 1)) as $document) {
?>
<form action="checkout.php" method="post" name="form2">
    <img src="<?php echo $document["img"] ?>" width="50px" height="40px" />
        <span class="grisconfondo"><?php echo $document["articulo"] ?></span>&nbsp;<span class="grisconfondo"><strong>$<?php echo $document["precio"] ?>.00</strong></span>&nbsp; &nbsp; <input name="id" type="hidden" value="<?php echo $document["_id"] ?>" />
        <input name="eliminar" type="hidden" value="" />
          <INPUT TYPE="image" name="delete" SRC="img/delete.png" 
               WIDTH="21"  HEIGHT="20" 
              BORDER="0" ALT="SUBMIT!"> </form>
<br />
<?php } ?>
           total:





<?php

echo "AQUI ESTOY LOCO Y NO ENCUENTRO LA SOLUCION PARA SUMAR TODO LO DE LA COLECCION ss_chaton_articulos_temp";

?>






                     <li></li>
                </ul>

                <br />
      </div>
    </div>
    </body>
</html>

Luis Cordova

unread,
Aug 9, 2014, 11:33:21 PM8/9/14
to mongod...@googlegroups.com
ponlo al menos en un gist.github.com para poder ver todo el codigo procedural, con razon php se gano en el pasado mala fama 


--
Has recibido este mensaje porque estás suscrito al grupo "MongoDB Perú" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a mongodb-lima...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a mongod...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/mongodb-lima.

Eloir Casas

unread,
Aug 9, 2014, 11:37:34 PM8/9/14
to mongod...@googlegroups.com

Luis Cordova

unread,
Aug 10, 2014, 12:21:25 AM8/10/14
to mongod...@googlegroups.com
tienes un monton de fallas

ejemplo

if ($tiempod = '30')


eso no compara sino asigna

no?

--
Has recibido este mensaje porque estás suscrito al grupo "MongoDB Perú" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a mongodb-lima...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a mongod...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/mongodb-lima.

Eloir Casas

unread,
Aug 10, 2014, 12:43:21 AM8/10/14
to mongod...@googlegroups.com
si eso no me funciono lo quitare, gracias lo que requiero es lo de sumar

Luis Cordova

unread,
Aug 10, 2014, 1:14:35 AM8/10/14
to mongod...@googlegroups.com
yo creo que ya te han dado las herramientas, incluso varias respuestas de intentar copiar y pegar, intentaste?

yo intentaria alguna de ellas, sino ir por los principios, leyendo la documentacion como la mayoria


2014-08-09 23:43 GMT-05:00 Eloir Casas <eloir...@gmail.com>:
si eso no me funciono lo quitare, gracias lo que requiero es lo de sumar

--
Has recibido este mensaje porque estás suscrito al grupo "MongoDB Perú" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a mongodb-lima...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a mongod...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/mongodb-lima.

Gildus

unread,
Aug 10, 2014, 9:33:57 AM8/10/14
to mongod...@googlegroups.com

Pense que era tema de mongo por la consulta SQL que inicalmente planteastes, pero creo que es mas tema de php o del MongoClient.

Tal vez en php-peru te puedan dar mas detalles:

https://groups.google.com/forum/m/#!forum/phpperu

Saludos,

Eloir Casas

unread,
Aug 10, 2014, 2:02:58 PM8/10/14
to mongod...@googlegroups.com
Muchas gracias por su ayuda, logre que me arrojara la suma , pero me aparece una lista de valores con var_dump($out) 
pero me aparecen muchos valores, como le puedo hacer para que solo me aparezca el totalsum, les agradezco de antemano.

Eloir Casas

unread,
Aug 10, 2014, 4:53:47 PM8/10/14
to mongod...@googlegroups.com
 

<?php
$m = new MongoClient("mongodb://127.0.0.1:27017");
    $c = $m->selectDB("carrito")->selectCollection("ss_chaton_articulos_temp");
$cursor = $c->find();

    $out = $c->aggregate(array(
            '$group' => array(
                '_id' => '$status',
               'totalPop' => array('$sum' => '$precio')
            )
        ),
        array(
            '$match' => array('totalPop' => array('$gte' => 0))
        )
    );
 
    ????????????????????

?>

Jorge Puente Sarrín

unread,
Aug 11, 2014, 3:27:49 AM8/11/14
to mongod...@googlegroups.com
Hola Eloir,

Lo que Juan Carlos te pregunta es la estructura que llevan tus documentos; es decir, lo que él necesita es tener un documento de ejemplo con el cual pueda armar la consulta de agregación.

Por ejemplo, este sería un modelo de documento, sabiendo que los campos "precio" y "status" los mencionaste anteriormente:
{
        "_id" : ObjectId("53e863ed19867040a0b7a69c"),
        "idx" : 0,
        "precio" : 92.96934977173805,
        "status" : "disponible"
}

Algo que ahora he hecho para poder ayudarte a resolver tu problema es insertar documentos ficticios, algo simple:
vagrant@precise64:~$ mongo carrito
MongoDB shell version: 2.6.4
connecting to: carrito
> for (i=0; i<1000; i++){ db.ss_chaton_articulos_temp.insert({idx: i, precio: Math.random()*100, status: 'disponible'}); }

Con esto, ahora si ejecuto tu consulta de agregación, tal como la enviaste, el resultado se parece a esto:
> db.ss_chaton_articulos_temp.aggregate([{$group: {_id: "$status", totalPop: {$sum: "$precio"}}}, {$match: {totalPop: {$gte: 0}}}])
{ "_id" : "disponible", "totalPop" : 50353.933179192245 }

Aquí lo que en realidad hiciste es agrupar los documentos por su "status" y sumaste todo lo que está en "precio" para los documentos agrupados. Si es así como es lo que quieres hacer está bien. A excepción de la fase $match porque sé que nunca el campo "totalPop" tendrá valor negativo, quizás debas quitarlo si ocurre lo mismo para ti.

Otro ejemplo que te puede servir es quizás si quisieras sumar todo lo que hay en "precio" sin agrupación de ningún campo, pues tienes que cambiar el "_id" de la fase $group y asignarle null:
> db.ss_chaton_articulos_temp.aggregate([{$group: {_id: null, totalPop: {$sum: "$precio"}}}])
{ "_id" : null, "totalPop" : 50353.933179192245 }

Para pasar esto a PHP, básicamente es "traducir" los arrays de JavaScript a los de PHP, así como lo hiciste.

Debes considerar que para versiones de MongoDB anteriores a 2.6, vas a estar limitado a que la respuesta de ese valor no supere los 16MB; por tanto, probablemente al final del pipeline de agregación tengas que añadir una fase $limit. Lo que MongoDB aquí retorna es un documento con una clave "ok" que es un flag y otra "result" que tiene el array con los resultados y listo.

Y para versiones de MongoDB posteriores a 2.6 tienes la posibilidad de hacer que MongoDB te retorne un cursor, así que lo que deberás hacer es iterar sobre él. Teniendo como beneficio poder obtener un resultado mayor a 16MB y reducir el trabajo para retornar los resultados en un único lote.

Sólo para que quede claro por qué Juan Carlos mencionó que es más conveniente usar Aggregation Framework en lugar de MapReduce, es que para MapReduce necesitas enviar cadenas cuyo contenido deba tener funciones de JavaScript que MongoDB las ejecutará con un motor -obviamente- de JavaScript donde te vas a encontrar limitado por el GIL. En cambio con Aggregation Framework que lo tienes disponible desde la versión 2.2 de MongoDB, lo que ejecutas es realizado sin ningún motor JavaScript y es el mismo core de MongoDB (C++) quien se encarga de ese trabajo.

Cuéntanos si esto te ayuda.


--
Has recibido este mensaje porque estás suscrito al grupo "MongoDB Perú" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a mongodb-lima...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a mongod...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/mongodb-lima.

Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Jorge

Luis Cordova

unread,
Aug 11, 2014, 8:40:01 AM8/11/14
to mongod...@googlegroups.com
que era GIL? buena respuesta Jorge

{ "_id" : null, "totalPop" : 50353.933179192245 }


Eloir
si eso te devuelve el array tendras que hacer

$out['totalPop'] para jalar el valor del array que te devuelve




Reply all
Reply to author
Forward
0 new messages