按结果划分的MongoDB极限群
My mongo DB有一个具有以下结构的文档:按结果划分的MongoDB极限群,mongodb,aggregation-framework,mongoengine,Mongodb,Aggregation Framework,Mongoengine,My mongo DB有一个具有以下结构的文档: {'vname':'x', 'pname': 'xyz', 'price': '10000'} 我想获取与pname='xy'匹配的所有文档,然后按vname分组,并将每个vname的结果限制为4 pipeline = [ { '$facet': { 'v1': [ { '$match': {'vname': 'v1'}
{'vname':'x', 'pname': 'xyz', 'price': '10000'}
我想获取与pname='xy'
匹配的所有文档,然后按vname
分组,并将每个vname
的结果限制为4
pipeline = [
{
'$facet': {
'v1': [
{
'$match': {'vname': 'v1'}
},
{
'$sort': {'price': 1}
},
{
'$limit': 4
}
],
'v2': [
{
'$match': {'vname': 'v2'}
},
{
'$sort': {'price': 1}
},
{
'$limit': 4
}
]
}
}
]
docs = Pinfo.objects(pname__icontains='xy').aggregate(pipeline=pipeline)
我看到的另一种方法是对每个vname
docs = Pinfo.objects.filter(Q(pname__icontains='xy')&Q(vname__exact='v1')).limit(4)
还有其他方法可以达到同样的效果吗?
使用聚合和管道方法是更好的方法吗?您可以尝试
$match
条件pname
按$sort
升序排序(可选)pname
通过$group
并将根对象推到items中并生成数组vname
显示必填字段,并使用$project
$slice
如果希望所有对象都位于根目录中,则可以在上面的管道之后添加下面的管道
将项数组解构到对象$unwind
替换根目录中的items对象$replaceRoot
db.collection.aggregate([
{ $match: { pname: "xy" } },
{ $sort: { pname: 1 } },
{
$group: {
_id: "$vname",
items: { $push: "$$ROOT" }
}
},
{
$project: {
_id: 0,
vname: "$_id",
items: { $slice: ["$items", 4] }
}
}
])
{ $unwind: "$items" },
{ $replaceRoot: { newRoot: "$items" } }