我有如下模式
[
{
id:"111"
tags:[222,333,444,555]
},
{
id: "222"
tags:[312,345,534]
},
{
id:"333"
tags:[111,222,333,444,555]
},
]
我想找到所有的文档,其中标签数组大小大于由$match在聚合管道返回的文档大小,所以在上面,例如文档的数量是3,所以我想返回所有的文档,标签数组大小大于3
[
{
id:"111"
tags:[222,333,444,555]
},
{
id:"333"
tags:[111,222,333,444,555]
},
]
我正在使用聚合管道来处理其他信息,我被困在如何存储文档大小以便我可以找到所有大于文档大小的标签
下面是我正在使用的查询,我想在聚合和一次调用中做它
.aggregate([
{
"$match":{
"ids":{
"$in":[
"111",
"222",
"333"
]
}
}
})]
Facet帮你解决这个问题。
$facet
有助于对传入文档进行分类。我们使用totaldoc
对文档进行计数,使用alldocuments
获取所有文档$arrayelemat
有助于从TotalDoc
获取第一个对象,我们已经知道在TotalDoc
中应该只有一个对象。因为当我们对它进行分组时,我们使用_id:null
$unwind
有助于解除AllDocuments
数组的结构
这是代码
db.collection.aggregate([
{
$facet: {
totalDoc: [
{
$group: {
_id: null,
count: {
$sum: 1
}
}
}
],
allDocuments: [
{
$project: {
tags: 1
}
}
]
}
},
{
$addFields: {
totalDoc: {
"$arrayElemAt": [
"$totalDoc",
0
]
}
}
},
{
$unwind: "$allDocuments"
},
{
$addFields: {
sizeGtDoc: {
$gt: [
{
$size: "$allDocuments.tags"
},
"$totalDoc.count"
]
}
}
},
{
$match: {
sizeGtDoc: true
}
},
{
"$replaceRoot": {
"newRoot": "$allDocuments"
}
}
])
工作蒙哥游乐场