查询mongo数据库的字段值而不返回内容

时间:2015-06-05 15:13:55

标签: node.js mongodb

我正在运行一个小型节点服务器,如果产品存在,它会检查mongo数据库。然后,它会将产品信息返回给移动应用。这些产品通常会有多个与之关联的图像,移动应用程序的下载速度可能会很慢,而且并非总是如此。我想要做的是检查数据库,如果产品在“images”数组中有图像,如果是这样,只返回一个布尔值,而不是图像本身。然后,用户将根据该布尔值是否为真,决定仅为图像发出另一个GET请求。

来自服务器的代码:

router.route('/products/:sku')
.get(function (req, res) {
    var query = Product.find({sku: req.params.sku}, {
        name: true,
        sku: true,
        storeName: true,
        timeScanned: true,
        scannedBy: true,
        activity: true,
        activityId: true,
        images: true
    });
    query.exec(function (err, product) {
        if (product.images.length > 0) {
            product.images = true;
        } else {
            product.images = false;
        }
        if (err) return (err);
        if (product[0]) {
            res.json({
                message: 'Product in Database!',
                product: product[0]
            });

当我查询我知道在“images”数组中包含两个图像的产品时,我得到'TypeError:无法读取未定义的属性'长度'。有什么想法吗?

更新:错误实际上相当简单。出于某种原因,mongo将其结果返回到数组中,因此要检查“图像”的长度,我必须检查产品 [0] .images.length 而不是产品。 images.length

希望这有助于其他人。

1 个答案:

答案 0 :(得分:0)

您可以使用MongoDB aggregation framework获取数组的$size,然后决定该怎么做。所以考虑一下这个聚合查询:

Product.aggregate([{'$match': {'sku': req.params.sku}}, {'$project': {
        name: true,
        sku: true,
        storeName: true,
        timeScanned: true,
        scannedBy: true,
        activity: true,
        activityId: true,
        hasImages: {'$size': '$images'}
    }}],
    function (err, product) {
        if (product.images.length > 0) {
            ...
        } else {
            ...
        }
        .
        .
        .
    }
)

这会为您提供一个光标,其中包含与您的查询匹配的文档,但有一个区别在于它不包含您的images字段,而是imagesSize字段,它将指示项目数在images数组中。