将某种行号添加到mongodb聚合命令/管道中

时间:2016-02-03 10:32:59

标签: mongodb mongodb-query aggregation-framework

这个想法是将一种行号返回给mongodb聚合命令/管道。与我们在RDBM中的情况类似。

它应该是一个唯一的数字,如果它与行/数字完全匹配则不重要。

对于像这样的查询:

  [   { $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 }

是否可以在mongodb中生成此rownum?

2 个答案:

答案 0 :(得分:6)

不确定大查询中的性能,但这至少是一种选择。

您可以通过分组/推送将结果添加到数组中,然后使用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或每页显示的任何内容,只需添加数字即可。 $ jump阶段到你的rownum,你将获得真正的位置,而不必推动你的所有结果来枚举它们。

答案 1 :(得分:0)

另一种方法是使用“$function”跟踪 row_number

[{ $match: { "author" : { $ne: 1 } }}  , { $limit: 1000000 },
{
    $set: {
      "rownum": {
        "$function": {
          "body": "function() {try {row_number+= 1;} catch (e) {row_number= 0;}return row_number;}",
          "args": [],
          "lang": "js"
        }
      }
    }
  }]

我不确定这是否会搞砸一些事情!