Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按结果划分的MongoDB极限群_Mongodb_Aggregation Framework_Mongoengine - Fatal编程技术网

按结果划分的MongoDB极限群

按结果划分的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'}

My mongo DB有一个具有以下结构的文档:

{'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
    通过
    vname
    并将根对象推到items中并生成数组
  • $project
    显示必填字段,并使用
    $slice


如果希望所有对象都位于根目录中,则可以在上面的管道之后添加下面的管道

  • $unwind
    将项数组解构到对象
  • $replaceRoot
    替换根目录中的items对象

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" } }