Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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
Python MongoEngine(烧瓶)有时不能正确排序(通过聚合)_Python_Mongodb_Mongoengine_Flask Mongoengine - Fatal编程技术网

Python MongoEngine(烧瓶)有时不能正确排序(通过聚合)

Python MongoEngine(烧瓶)有时不能正确排序(通过聚合),python,mongodb,mongoengine,flask-mongoengine,Python,Mongodb,Mongoengine,Flask Mongoengine,尝试按两个字段排序,优先考虑第一个字段,但在大多数情况下,似乎优先考虑第二个字段(姓氏)。有时,它工作正常-不确定是什么导致了变化 使用Robo3t作为客户端,连接同一个数据库,同样的命令也可以正常工作 运行烧瓶并使用Mongoengine,代码如下: pipeline = [{"$sort": {"importance": -1, "lastName": 1}}, {"$match": {"visible": True, "editionId": "2017"}}, {

尝试按两个字段排序,优先考虑第一个字段,但在大多数情况下,似乎优先考虑第二个字段(姓氏)。有时,它工作正常-不确定是什么导致了变化

使用Robo3t作为客户端,连接同一个数据库,同样的命令也可以正常工作

运行烧瓶并使用Mongoengine,代码如下:

pipeline = [{"$sort": {"importance": -1, "lastName": 1}}, {"$match": {"visible": True, "editionId": "2017"}},
            {"$project": {'firstName': 1, 'lastName': 1, 'biography': 1, 'position': 1, 'workAt': 1, '_id': 0,
                          "imageUrl": 1}}]
doc = Speakers.objects.aggregate(*pipeline)
相同的代码(除了'True'变为'True'),在Robo3t中:

db.getCollection('speakers').aggregate([{"$sort": {"importance": -1, "lastName": 1}}, {"$match": {"visible": true, "editionId": "2017"}},
            {"$project": {'firstName': 1, 'lastName': 1, 'biography': 1, 'position': 1, 'workAt': 1, '_id': 0,
                          "imageUrl": 1}}], {"collation": {"locale": "en"}}
      )
mongodb(3.4.9)上的索引如下:

> db.speakers.getIndexes()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "website_v3.speakers"
    }
]
使用db v3.4.9版

我甚至尝试过为重要性创建一个索引(排序规则),但同样的情况也发生了。先是有效,然后无效

欢迎有任何想法

编辑:

似乎flask_mongoengine正在扰乱$sort的订单以及$project

mongo
> db.system.profile.find().pretty()
{
    "op" : "query",
    "ns" : "website_v3.system.profile",
    "query" : {
        "find" : "system.profile",
        "filter" : {

        }
    },
    "keysExamined" : 0,
    "docsExamined" : 0,
    "cursorExhausted" : true,
    "numYield" : 0,
    "locks" : {
        "Global" : {
            "acquireCount" : {
                "r" : NumberLong(2)
            }
        },
        "Database" : {
            "acquireCount" : {
                "r" : NumberLong(1)
            }
        },
        "Collection" : {
            "acquireCount" : {
                "r" : NumberLong(1)
            }
        }
    },
    "nreturned" : 0,
    "responseLength" : 98,
    "protocol" : "op_command",
    "millis" : 0,
    "planSummary" : "COLLSCAN",
    "execStats" : {
        "stage" : "COLLSCAN",
        "nReturned" : 0,
        "executionTimeMillisEstimate" : 0,
        "works" : 2,
        "advanced" : 0,
        "needTime" : 1,
        "needYield" : 0,
        "saveState" : 0,
        "restoreState" : 0,
        "isEOF" : 1,
        "invalidates" : 0,
        "direction" : "forward",
        "docsExamined" : 0
    },
    "ts" : ISODate("2017-10-19T20:55:30.415Z"),

}
{
    "op" : "command",
    "ns" : "website_v3.speakers",
    "command" : {
        "aggregate" : "speakers",
        "pipeline" : [
            {
                "$match" : {
                    "visible" : true,
                    "editionId" : "2017"
                }
            },
            {
                "$sort" : {
                    "lastName" : 1,
                    "importance" : -1
                }
            },
            {
                "$project" : {
                    "firstName" : 1,
                    "position" : 1,
                    "biography" : 1,
                    "workAt" : 1,
                    "imageUrl" : 1,
                    "_id" : 0,
                    "lastName" : 1
                }
            }
        ],
        "cursor" : {

        }
    },
    "cursorid" : 168077246844,
    "keysExamined" : 0,
    "docsExamined" : 541,
    "hasSortStage" : true,
    "numYield" : 4,
    "locks" : {
        "Global" : {
            "acquireCount" : {
                "r" : NumberLong(16)
            }
        },
        "Database" : {
            "acquireCount" : {
                "r" : NumberLong(8)
            }
        },
        "Collection" : {
            "acquireCount" : {
                "r" : NumberLong(7)
            }
        }
    },
    "nreturned" : 101,
    "responseLength" : 157635,
    "protocol" : "op_query",
    "millis" : 2,
    "planSummary" : "COLLSCAN",
    "ts" : ISODate("2017-10-19T20:55:57.691Z"),
}
{
    "op" : "getmore",
    "ns" : "website_v3.speakers",
    "query" : {
        "getMore" : NumberLong("168077246844"),
        "collection" : "speakers"
    },
    "originatingCommand" : {
        "aggregate" : "speakers",
        "pipeline" : [
            {
                "$match" : {
                    "visible" : true,
                    "editionId" : "2017"
                }
            },
            {
                "$sort" : {
                    "lastName" : 1,
                    "importance" : -1
                }
            },
            {
                "$project" : {
                    "firstName" : 1,
                    "position" : 1,
                    "biography" : 1,
                    "workAt" : 1,
                    "imageUrl" : 1,
                    "_id" : 0,
                    "lastName" : 1
                }
            }
        ],
        "cursor" : {

        }
    },
    "cursorid" : 168077246844,
    "keysExamined" : 0,
    "docsExamined" : 0,
    "hasSortStage" : true,
    "cursorExhausted" : true,
    "numYield" : 0,
    "locks" : {
        "Global" : {
            "acquireCount" : {
                "r" : NumberLong(4)
            }
        },
        "Database" : {
            "acquireCount" : {
                "r" : NumberLong(2)
            }
        },
        "Collection" : {
            "acquireCount" : {
                "r" : NumberLong(2)
            }
        }
    },
    "nreturned" : 204,
    "responseLength" : 303603,
    "protocol" : "op_query",
    "millis" : 0,
    "planSummary" : "COLLSCAN",
    "ts" : ISODate("2017-10-19T20:55:57.702Z"),
}

MongoDB将按照您指定的确切顺序执行聚合阶段(在大多数情况下)。
$match
运算符不保证输出顺序


因此,您希望将
$match
放在管道的开头(后面是
$sort
),这对于性能来说是个好主意。

MongoDB将按照您指定的确切顺序执行聚合阶段(在大多数情况下)。
$match
运算符不保证输出顺序


因此,您可能希望将
$match
放在管道的开头(后面是
$sort
),这对于性能来说是个好主意。

我尝试按照您的建议放置
$match
然后
$sort
,但得到了相同的结果。项目按
lastName
而不是
重要性进行排序。奇怪的是,无论哪种方式,它在Robo3T中都工作得非常好。我建议您将查询记录在服务器端并进行比较。如果flask搞砸了可以解释它的查询。但是,如果使用Robo3T和您的应用程序记录了完全相同的查询,那么问题一定在其他地方:其他潜在的混淆来源可能是排序规则设置、混合字段类型(例如,int和string表示重要性)、空值、值开头多余的空格字符或字段名称中的键入错误。最后,您可能需要测试排序的其他方法,例如只使用
find()
或不使用其他两个阶段来隔离问题。另外,我想知道,如何检测不正确的排序-应用程序中的任何内容是否会对检索到的数据进行处理,从而可能改变排序顺序?我已尝试按照您的建议放置
$match
,然后
$sort
,但得到了相同的结果。项目按
lastName
而不是
重要性进行排序。奇怪的是,无论哪种方式,它在Robo3T中都工作得非常好。我建议您将查询记录在服务器端并进行比较。如果flask搞砸了可以解释它的查询。但是,如果使用Robo3T和您的应用程序记录了完全相同的查询,那么问题一定在其他地方:其他潜在的混淆来源可能是排序规则设置、混合字段类型(例如,int和string表示重要性)、空值、值开头多余的空格字符或字段名称中的键入错误。最后,您可能需要测试排序的其他方法,例如,只使用
find()
或不使用其他两个阶段来隔离问题。此外,我想知道,您如何检测不正确的排序-您的应用程序中是否有任何东西会对检索到的数据进行处理,从而可能改变顺序?