2016-02-03 109 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

这是一个改进 - 当数据量很大时(> 100mio),在使用MongoDB数据源获取数据的BI工具上使用id作为字符串真的是一个坏主意。除非... – 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