【问题标题】:Mongo query to sort results with maximum number of distinct attributes or keys?Mongo查询以最大数量的不同属性或键对结果进行排序?
【发布时间】:2016-11-03 19:56:08
【问题描述】:

我需要编写一个 MongoDB 查找查询来从集合中获取结果并根据每行的最大属性对它们进行排序。

例如: 现在的结果是这样的:

[{
    column1 : "abc",
    column2 : "def",
},
{
    column1 : "abc",
},
{
    column1 : "abc",
    column2 : "def",
    column3 : "ghi"
}]

应该返回什么查询(按列数降序排列):

[{
    column1 : "abc",
    column2 : "def",
    column3 : "ghi"
},
{
    column1 : "abc",
    column2 : "def",
},
{
    column1 : "abc",
}]

查询是 db..find({"column1": "abc"});

是否可以通过查询数据库来实现?

【问题讨论】:

  • 您当前的查询是什么?
  • @AndriySimonov 这是一个简单的查找查询 db..find({"SOME_ATTRIBUTE": "SOME_VALUE" });返回问题中提到的多个结果。
  • 您可以编写代码自己对结果进行排序,结果数量是否过多?
  • @marmor 是的,数据集太大了。
  • @Tairman 你知道文档中所有可能的字段吗?

标签: mongodb mongodb-query


【解决方案1】:

不是最优的,但你可以调用 mapReduce 来按字段数获取 id,然后按升序查询这些 id,这是一些开始的代码(未测试!

var map = function(doc) {
   emit(Object.keys(doc).length, doc._id);
}
var reduce = function(key, values) {
   return values;
}
coll.mapReduce(function() { map(this) }, reduce, function(err, results) {
   results.sort((a,b) => { return a._id > b._id });
   results.forEach(result => {
      console.log("now getting ids with " + result._id + " fields");
      var cursor = coll.find({ _id : { $in : result.value}});
      // do something with cursor.
   });
);

另一种选择是向每个文档“fields_count”添加一个字段,该字段将保存该文档的字段数,您可以使用该字段进行查询。

【讨论】:

  • 我正在寻找一个服务器端解决方案,最好不要对结果进行排序。这将是最后的手段。不过还是谢谢。
  • 一个明显的解决方案可能是为每个文档“fields_count”添加一个字段,您可以使用它来排序
  • 那将是一个不错的选择,我认为这应该可以解决问题。另外,@marmor 你知道一种从 mongoDB 本身获取集合元数据以获取集合具有的所有不同列的方法吗?就像 MySQL 的 Information Schema。
  • 我会更新我的答案以包含评论。关于不同的列,mongodb 是无模式的,因此它无法知道存在哪些字段而无需遍历集合中的所有文档。你也可以使用 mapReduce 来做到这一点,如果需要帮助,请搜索 StackOverlow(或提出新问题)
  • 我认为 Map-reduce 是一种可行的方法,并且可能是最好的解决方案。我会用你的sn-p。感谢您的帮助。
猜你喜欢
  • 2018-05-03
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
相关资源
最近更新 更多