如何解决我如何才能通过嵌套数组中的键获取交点,然后通过上一个键从另一个键获取所有值
我有一个包含以下三个文档的集合:
[
{
_id: 1,title: 1,set: [
{
pid: 'p1',vid: 'p1v1',},{
pid: 'p2',vid: 'p2v1',],{
_id: 2,title: 2,vid: 'p1v2',vid: 'p2v2',}
]
},{
_id: 3,title: 3,vid: 'p1v3',{
pid: 'p3',vid: 'p3v1',}
]
}
]
A:
我可以从所有三个文档pid
中获得所有的交集'p1'
,其汇总如下:
[
{ $group: { _id: 0,pids: { $push: "$set.pid" } } },{
$project: {
_id: 0,pids: {
$reduce: {
input: "$pids",initialValue: { $arrayElemAt: ["$pids",0] },in: { $setIntersection: ["$$this","$$value"] },}
}
}
}
]
B:
如何通过交点vid
获得所有关联的pid
?
在这种情况下,pid
是'p1'
,vid
将是['p1v1','p1v2','p1v3']
解决方法
这是我要怎么做:
db.collection.aggregate([
{
$unwind: "$set"
},{
$match: {
"set.pid": "p1"
}
},{
$group: {
_id: "$set.pid",vids: {
"$addToSet": "$set.vid"
}
}
}
])
您还可以删除$match
阶段,然后获得每个pid
的结果。
------------------------编辑---------------------- -----------
在所有文档中都出现pid
的要求:
(我建议您对集合中的文档数量进行预计数,以便可以在汇总中进行计算)
db.collection.aggregate([
{
$unwind: "$set"
},vids: {
"$addToSet": "$set.vid"
},ids: {
"$addToSet": "$_id"
}
}
},{
$match: {
$expr: {
$eq: [
{
$size: "$ids"
},3
]
}
}
},{
$project: {
_id: 1,vids: 1
}
}
])
如果您不想预先计算文档数量,则必须添加一个初始$group
阶段(这意味着我们将必须对整个集合进行分组),我个人建议不要这样做但是这是它的代码:
db.collection.aggregate([
{
$group: {
_id: null,roots: {
"$addToSet": "$$ROOT"
},count: {
$sum: 1
}
}
},{
$unwind: "$roots"
},{
$unwind: "$roots.set"
},{
$group: {
_id: "$roots.set.pid",vids: {
"$addToSet": "$roots.set.vid"
},ids: {
"$addToSet": "$roots._id"
},docCount: {
$first: "$count"
}
}
},"$docCount"
]
}
}
},vids: 1
}
}
])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。