Mongodb: SORT vs $ORDERBY

Никак не могу понять, что от меня хотят.
docs.mongodb.org/manual/reference/operator/meta/orderby/

Вроде как это все одинаково, однако, в одном случае используется индекс и сканируется 1 запись, в другом случае индекс не используется и сканируются все записи в коллекции:
db.user_event_collection.find().sort({created_at:-1}).limit(1).explain()
{
        "cursor" : "BtreeCursor created_at_1 reverse",
        "isMultiKey" : false,
        "n" : 1,
        "nscannedObjects" : 1,
        "nscanned" : 1,
        "nscannedObjectsAllPlans" : 1,
        "nscannedAllPlans" : 1,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 0,
        "indexBounds" : {
                "created_at" : [
                        [
                                {
                                        "$maxElement" : 1
                                },
                                {
                                        "$minElement" : 1
                                }
                        ]
                ]
        },
        "server" : "devel.local:27017"
}


db.user_event_collection.find({$query:{}, $orderby:{created_at:-1}}).limit(1).explain()
{
        "cursor" : "BasicCursor",
        "isMultiKey" : false,
        "n" : 0,
        "nscannedObjects" : 14723972,
        "nscanned" : 14723972,
        "nscannedObjectsAllPlans" : 14723972,
        "nscannedAllPlans" : 14723972,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 10,
        "nChunkSkips" : 0,
        "millis" : 7846,
        "indexBounds" : {

        },
        "server" : "devel.local:27017"
}


Почему так?
  • Вопрос задан
  • 3349 просмотров
Решения вопроса 1
Потому что вы во втором варианте мешаете query и курсор, а так делать нельзя.
db
	.user_event_collection
	.find({
		$query:{},
		$orderby:{created_at:-1},
		$limit: 1,
		$explain: true
	}, onComplete);
	
function onComplete(err, cursor){
	
	cursor.explain(onExplain);
}

function onExplain(error, plan) {
	
	console.log(plan);
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы