{ "_id":"f885cb355d9ad18d0cc3aed45dc42e87", "status":0, "items": [ {"pId":"075734515d99df300c4f12df68415e50","pPrice":110.0,"pCost":85.0,"quantity":1.0}, {"pId":"392890432d99df300c4f12df68415f99","pPrice":110.0,"pCost":85.0,"quantity":2.0} ], "_openid":"oVCJa5DGovfnzgKr0u2Gn5viMHug"} |
类似于这种典型的数据结构,items为一个对象数组型字段,相当于关系型数据库的子表数据。我业务上需要对items做一些匹配和分组查询。如下语句:
const ordersRes = await db.collection('orders') .aggregate() .addFields({ matched: $.in(['$items.pId',pIds]) }) .match({ sellerId: sellerId, status: $.neq(-1), matched: true }) .group({ _id: '$items.pId', pQuantity: $.sum('$items.quantity') }) .end() |
遇到两个问题:
问题1:查询时,想针对pId进行筛选,我事先准好了一个有效的pIds数组,match有效的pId,但输出为0。而我用类似的语法,使用where可以工作,能把匹配上的记录输出。
.where({ sellerId: sellerId, status: _.neq(-1), 'items.pId': _.in(pIds) }) |
问题2,想针对pId进行分组,合计对应pId的quantity,但是并不能有效分组。实际输出的group条件是一个pId数组,也就是把items下面的多个pId抽取出来组成数组作为group条件了,并不是我所期望的单个pId进行分组,输出结果如下所示:
list: Array(10)0: {_id: Array(2), pQuantity: 0}1: {_id: Array(2), pQuantity: 0}2: {_id: Array(3), pQuantity: 0}3: {_id: Array(3), pQuantity: 0}4: {_id: Array(2), pQuantity: 0}5: {_id: Array(2), pQuantity: 0}6: {_id: Array(1), pQuantity: 0}7: {_id: Array(1), pQuantity: 0}8: {_id: Array(1), pQuantity: 0}9: {_id: Array(1), pQuantity: 0} |

var _ = db.command, $ = _.aggregate
db.collection('orders')
.aggregate()
.unwind({
path: '$items'
})
.addFields({
matched: $.in(['$items.pId', pIds])
})
.match({
sellerId: sellerId,
status: $.neq(-1),
matched: true
})
.group({
_id: '$items.pId',
pQuantity: $.sum('$items.quantity')
})
.end().then(res=>{
console.log(res)
})
unwind
https://developers.weixin.qq.com/community/develop/doc/000826392c4a88c7aa0a1fedb5b400?fromCreate=0
还是没有看懂如何获取item里面的指定的一条数据,能多指教一下吗
还没学到微信云数据库这么高深的知识。