我正在运行一个小型节点服务器,如果产品存在,它会检查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
希望这有助于其他人。
答案 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
数组中。