猫鼬&具有嵌套查询的mongoDB

时间:2017-08-24 17:23:14

标签: javascript node.js mongodb mongoose

我正在将我在mongoDB中执行的查询传递给mongoose并且它给了我错误。

mongo DB中的查询是:

db.facturas.find({
    _id: { 
        $in: db.detalles.distinct("id_factura", { 
            category: ObjectId("5889eae21ffcc6da2c6b4ae4")
        })
    }
})

在APP中我构建了这样的查询:

Factura.find({'_id': { "$in" : Detalle.distinct("id_factura",{qrycat}) } })
        .populate('pto_venta')
        .populate('forma_pago')
        .exec(function(err, result) {
          if (err) res.send(err);
          res.json(result); 
        });

我在NODEJS中收到以下错误:

  

/var/nodejs/aadides-sgi/node_modules/express/lib/response.js:242    var body = JSON.stringify(val,replacer,spaces);                   ^

     

TypeError:将循环结构转换为JSON      at Object.stringify(native)      在ServerResponse.json(/var/nodejs/aadides-sgi/node_modules/express/lib/response.js:242:19)      在ServerResponse.send(/var/nodejs/aadides-sgi/node_modules/express/lib/response.js:151:21)      at /var/nodejs/aadides-sgi/app/handlers/facturasHandler.js:494:22      at /var/nodejs/aadides-sgi/node_modules/mongoose/lib/query.js:2176:21      at /var/nodejs/aadides-sgi/node_modules/kareem/index.js:160:11      在Query._find(/var/nodejs/aadides-sgi/node_modules/mongoose/lib/query.js:1019:5)      at /var/nodejs/aadides-sgi/node_modules/kareem/index.js:156:8      at /var/nodejs/aadides-sgi/node_modules/kareem/index.js:18:7      at _combinedTickCallback(internal / process / next_tick.js:73:7)      at process._tickCallback(internal / process / next_tick.js:104:9)   events.js:160        扔掉//未处理的'错误'事件        ^

     

错误:读取ECONNRESET      at exports._errnoException(util.js:1018:11)      在Pipe.onread(net.js:568:26)

1 个答案:

答案 0 :(得分:0)

仔细检查distinct()的第二个参数,因为{qrycat}看起来不像是有效对象。

更重要的是,distinct()是异步的(就像大多数mongoose操作一样),所以在调用下一个操作之前,你需要有一个回调来获取ID。

Detalle.distinct("id_factura", {qrycat}, function (err, id_facturas) {
    if (err) 
        return res.send(err);
    // id_facturas should be an array
    Factura.find({'_id': { $in: id_facturas }})
        .populate('pto_venta forma_pago') // Mongoose >= 3.6
        .exec(function(err, result) {
            if (err) 
                return res.send(err); // don't forget the return
            res.json(result); 
        });
});