2016-02-03 2 views
2

Идея состоит в том, чтобы вернуть номер строки в командную строку/конвейер mongodb. Подобно тому, что мы имеем в RDBM.Добавить номер строки в команду/конвейер mongodb

Это должен быть уникальный номер, не имеющий значения, если он точно соответствует строке/номеру.

Для запроса типа:

[ { $match: { "author" : { $ne: 1 } }} , { $limit: 1000000 } ] 

Возвращение:

{ "rownum" : 0, "title" : "The Banquet", "author" : "Dante", "copies" : 2 } 
{ "rownum" : 1, "title" : "Divine Comedy", "author" : "Dante", "copies" : 1 } 
{ "rownum" : 2, "title" : "Eclogues", "author" : "Dante", "copies" : 2 } 
{ "rownum" : 3, "title" : "The Odyssey", "author" : "Homer", "copies" : 10 } 
{ "rownum" : 4, "title" : "Iliad", "author" : "Homer", "copies" : 10 } 

Можно ли создать этот ROWNUM в MongoDB?

+0

Нет, это невозможно. Возможно, вам будет лучше объяснять * «почему вы думаете, что вам нужно это» *. Обычно он используется в реализациях SQL для оконных постраничных результатов, например, когда элементы сортируются. Вероятнее всего, есть другие варианты, если вы скорее объяснили, как ваш вариант использования решить. –

+0

Это улучшение. Использование строки для id - действительно плохая идея, когда данные массивные,> 100mio, в инструменте BI, который берет данные из источника данных MongoDB. Нет действительно обходного пути, если ... – ic3

+0

Добавление чисел в строки в MongoDB (что вы не можете сделать в любом случае) означало бы передачу всех результатов/данных (предположительно, до выбора «страницы») и назначение по одному. Таким образом, никоим образом не было бы возможно улучшение из-за того, как архитектура делает вещи. Я дал вам возможность. 1. Примите «Нет, это невозможно сделать». 2. Объясните свой прецедент и, возможно, получите альтернативный подход, который лучше, чем вы могли до сих пор думать. Как я вижу, один из них - тупик, а другой - куда-то. –

ответ

2

Не уверен в производительности в больших запросах, но это, по крайней мере, вариант.

Вы можете добавить свои результаты в массив с помощью группировки/толкая, а затем расслабиться с includeArrayIndex, как это:

[ 
    {$match: {author: {$ne: 1}}}, 
    {$limit: 10000}, 
    {$group: { 
    _id: 1, 
    book: {$push: {title: '$title', author: '$author', copies: '$copies'}} 
    }}, 
    {$unwind: {path: 'book', includeArrayIndex: 'rownum'}}, 
    {$project: { 
    author: '$book.author', 
    title: '$book.title', 
    copies: '$book.copies', 
    rownum: 1 
    }} 
] 

Теперь, если база данных содержит большое количество записей, и вы намерены постраничными, вам можете использовать этап $ skip, а затем $ limit 10 или 20 или все, что вы хотите отобразить на странице, и просто добавьте число от этапа $ skip к вашему rownum, и вы получите реальную позицию без необходимости выталкивать все ваши результаты перечислить их.

+1

Это выглядит ужасно неэффективным, но это то, что мне нужно, и отвечает на вопрос. – VillasV

Смежные вопросы