Объясните, почему результаты от mongo возвращаются в обратном порядке ObjectId? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть список элементов новостной статьи, которые я помечаю для сущностей, и теги тем.

мой запрос

db["fmetadata"].find({'$and': [{'$text': {'$search': 'apple trump'}}, {'$or': 
[{'entities': {'$elemMatch': {'$regex': 'apple|trump'}}}, {'tags': {'$elemMatch': {'$regex': 'apple|trump'}}}]}]}).explain()

план запроса

{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "dfabric.fmetadata",
                "indexFilterSet" : false,
                "parsedQuery" : {
                        "$and" : [
                                {
                                        "$or" : [
                                                {
                                                        "entities" : {
                                                                "$elemMatch" : {
                                                                        "$regex" : "apple|trump"
                                                                }
                                                        }
                                                },
                                                {
                                                        "tags" : {
                                                                "$elemMatch" : {
                                                                        "$regex" : "apple|trump"
                                                                }
                                                        }
                                                }
                                        ]
                                },
                                {
                                        "$text" : {
                                                "$search" : "apple trump",
                                                "$language" : "english",
                                                "$caseSensitive" : false,
                                                "$diacriticSensitive" : false
                                        }
                                }
                        ]
                },
                "winningPlan" : {
                        "stage" : "FETCH",
                        "filter" : {
                                "$or" : [
                                        {
                                                "entities" : {
                                                        "$elemMatch" : {
                                                                "$regex" : "apple|trump"
                                                        }
                                                }
                                        },
                                        {
                                                "tags" : {
                                                        "$elemMatch" : {
                                                                "$regex" : "apple|trump"
                                                        }
                                                }
                                        }
                                ]
                        },
                        "inputStage" : {      
                "stage" : "TEXT",
                                "indexPrefix" : {

                                },
                                "indexName" : "title_text_tags_text_entities_text",
                                "parsedTextQuery" : {
                                        "terms" : [
                                                "appl",
                                                "trump"
                                        ],
                                        "negatedTerms" : [ ],
                                        "phrases" : [ ],                                  
                    "negatedPhrases" : [ ]
                                },
                                "textIndexVersion" : 3,
                                "inputStage" : {
                                        "stage" : "TEXT_MATCH",
                                        "inputStage" : {
                                                "stage" : "FETCH",
                                                "inputStage" : {
                                                        "stage" : "OR",
                                                        "inputStages" : [
                                                                {
                                                                        "stage" : "IXSCAN",
                                                                        "keyPattern" : {
                                                                                "_fts" : "text",
                                                                                "_ftsx" : 1
                                                                        },
                                                                        "indexName" : "title_text_tags_text_entities_text",
                                                                        "isMultiKey" : true,
                                                                        "isUnique" : false,
                                                                        "isSparse" : false,
                                                                        "isPartial" : false,
                                                                        "indexVersion" : 2,
                                                                        "direction" : "backward",
                                                                        "indexBounds" : {

                                                                        }
                                                                },
                                                                {
                                                                        "stage" : "IXSCAN",
                                                                        "keyPattern" : {
                                                                                "_fts" : "text",
                                                                                "_ftsx" : 1
                                                                        },
                                                                        "indexName" : "title_text_tags_text_entities_text",
                                                                        "isMultiKey" : true,
                                                                        "isUnique" : false,
                                                                        "isSparse" : false,
                                                                        "isPartial" : false,
                                                                        "indexVersion" : 2,
                                                                        "direction" : "backward",
                                                                        "indexBounds" : {

                                                                        }
                                                                }
                                                        ]
                                                }
                                        }
                                }
                        }
                },
                "rejectedPlans" : [ ]
        },
        "serverInfo" : {
                "host" : "fabric-dev",
                "port" : 27017,
                "version" : "4.0.2",
                "gitVersion" : "fc1573ba18aee42f97a3bb13b67af7d837826b47"
        },
        "ok" : 1
}

Я вижу, что

["queryPlanner"]["winningPlan"]["inputStage"]["inputStage"]["inputStages"]

"stage": "IXSCAN"
"direction": "backward"

Можно ли это объяснить, почему?

Я разрабатывал курсор нумерации страниц, используя> lastId, и метод ограничения.Но поскольку результаты возвращаются в обратном порядке, я должен использовать

Если я не сортирую результаты в естественном порядке, можно ли гарантировать, что они всегда будут в обратном / обратном направлении??

Редактировать: как упомянуто в комментарии ниже. Моя цель заключается в том, чтобы получить представление о том, почему индекс был отсканирован задом наперед - так ли я сформулировал свой запрос?или что-то еще целиком?Порядок следования вперед или назад не так важен, как постоянство его всегда и всегда - либо всегда вперед, либо наоборот

1 Ответ

0 голосов
/ 15 октября 2018

Я сталкивался с этим вопросом о stackoverflow, и я считаю, что принятый ответ с комментариями ниже удовлетворительно дает мне ту интуицию, которую я искал.

Как записи сортировки MongoDB, когда нет порядка сортировкиуказано?

...