MarkLogic node.js:根据json元素的值对同一文档中的多个实例进行排序

MarkLogic node.js:根据json元素的值对同一文档中的多个实例进行排序,marklogic,Marklogic,抱歉,如果标题不清楚,但我发现我的问题很难简单解释。我有许多JSON文档的结构如下: { "count": 100, "groups": [ { "name": "group A", "count": 12 }, { "name": "group B", "count": 22 }, { "name": "group C", "count": 7 } ] } 基本上,文档有一个项目计数,

抱歉,如果标题不清楚,但我发现我的问题很难简单解释。我有许多JSON文档的结构如下:

{
  "count": 100,
  "groups": [
    {
    "name": "group A",
    "count": 12
    },
    {
    "name": "group B",
    "count": 22
    },
    {
    "name": "group C",
    "count": 7
    }
  ]
}
基本上,文档有一个项目计数,再加上将该计数细分为更小的组。所以这个记录代表了100个项目的集合,其中12个来自a组,22个来自B组,7个来自C组

现在,我有一个关于“count”的元素范围索引和一堆这样的文档。我希望能够按照以下任何选项进行排序:

  • 按总计数排序(降序或升序)
  • 按组A计数排序(降序或升序)
  • 按B组计数排序(降序或升序)
  • 按C组计数排序(降序或升序)
我试过了

.orderBy(qb.sort("count", "descending"))
这似乎是按总成本(文档根目录中的成本)排序的,但我不确定这是否总是正确的,或者我需要指定其他内容来保证它总是得到特定的成本

对于按特定组排序,我不知道如何指定它


有什么建议吗?

是否可以将每个组存储在单独的文档中?这样,您就可以独立地对组进行匹配和排序,并计算任何组组合的总计

对于熟悉关系数据库的人来说,最佳粒度是将每一行建模为一个单独的文档

在MarkLogic9上,您可以编写一个TDE,将每个组作为一个单独的行进行投影,然后对行进行排序,而不考虑文档持久性

但是,如果单独更新组,最好为每个组编写单独的文档

如果您使用MarkLogic 8,并且必须在一个文档中存储多个组,那么可以在enode上使用服务器端JavaScript或XQuery对节点进行排序。虽然这种方法在功能上可行,但它并没有充分利用MarkLogic的功能


所有这些都假设您必须具体化这些count文档。另一个问题是,您是否可以将计数的内容放入文档中,将A、B和C集合放入这些可计数文档中,并动态计算任何可计数文档组合的计数


希望这能有所帮助,

请参阅前面与数据建模或使用TDE相关的答案


否则,如果组的数量有限,并且每个组在每个文档中只存在一次,则可以为上面的每个组使用一个单独的路径范围索引,然后通过引用适当的索引进行排序。

“是否可以将每个组存储在单独的文档中?”->是,这是我考虑的第一个选择。主要的问题是它大大增加了我们的文档数量。“另一个问题是,您是否可以将已计算的内容放入文档中,将A、B和C集合放入这些可计算文档中,并动态计算任何可计算文档组合的数量。”->事实上,我上面给出的示例文档基本上是我们生成的一个汇总表,因为它似乎比每次都按这些计数进行动态计数和排序的性能更好。不是这样吗?上面的例子也被简化了,因为我们还在汇总表中包含了我们仍然需要排序的总和(总体和每组)。在第一个问题上,MarkLogic是为大量文档设计的。最小化文档数量不是优化性能的方法。在第二个问题上,MarkLogic的设计目的是非常有效地相交集合并计算集合的频率。(这是一个方面的本质。)只有在发现无法通过调整索引解决的性能问题时,才应考虑具体化搜索结果。不幸的是,组的数量在未来可能会增加。重新建模或TDE是您可能的选择-我的建议是重新建模。