Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向mongodb聚合命令/管道添加某种行号_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

向mongodb聚合命令/管道添加某种行号

向mongodb聚合命令/管道添加某种行号,mongodb,mongodb-query,aggregation-framework,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" : "Di

其思想是向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?

不确定在大查询中的性能,但这至少是一个选项

您可以通过分组/推送,然后使用
includearayindex
将结果添加到数组中,如下所示:

[
  {$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 stage,然后使用$limit 10或20或任何您希望每页显示的内容,只需将$skip阶段的数字添加到rownum中,就可以得到真实的位置,而无需推送所有结果来枚举它们。

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


我不确定这是否会把事情搞砸

不,这是不可能的。你最好解释一下“为什么你认为你需要这个”。它通常在SQL实现中用于窗口分页结果,例如对项目进行排序时。如果您更愿意解释您要解决的用例,那么可能还有其他选择。这是一个改进-在从MongoDB数据源获取数据的BI工具上,当数据量大于100mio时,使用字符串作为id确实是一个坏主意。没有真正的解决方法,除非……在MongoDB中向行添加数字(无论如何都不能这样做)意味着传递所有结果/数据(可能是在选择“页面”之前)并一次分配一个。因此,由于体系结构的工作方式,这绝不可能是一种改进。我给了你选择权。1.接受“不,这是做不到的”。2.解释您的用例,并可能获得一种比您目前所能想到的更好的替代方法。在我看来,一个是死胡同,而另一个可能只是去了某个地方。这看起来效率非常低,但这正是我所需要的,并回答了问题。小心,$group不会对其输出文档进行排序。
[{ $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"
        }
      }
    }
  }]