按MongoDB中有序的非相邻数组元素分组

时间:2016-10-19 13:01:54

标签: mongodb mapreduce mongodb-query aggregation-framework

我有一个问题,我想知道我是否可以在MongoDB聚合框架或MapReduce级别解决它,而不是在服务器代码中执行它。 问题: 我有以下集合:

[
  {
    id:...,
    pages:[
       000,
       111,
       222,
       666,
       999....
    ]
  },
  {
    id:...,
    pages:[
       111,
       666,
       999....
    ]
  },
  .
  .
  .
]

我希望能够要求这条路径:111,999并且聚合将返回2的数量,为什么!?因为111和999按此顺序出现在两个文档中,无论它们之间有多少元素。 此外,我希望能够请求000,222,999,这将只返回1(计数),因为此顺序中的这三个数组元素仅出现在一个文档中。

在我的案件中,订单是必须的 如果我有另一个页面文件:[999,666,111],我想找到所有666,999我不希望这个文件成为结果的一部分,因为999,666与666,999不一样

这意味着我无法对数组进行排序,顺序很重要,我希望找到包含给定元素的数组,但按此顺序

我希望我能正确解释我的问题.... 在MongoDB级别中执行此操作的最佳方法是什么,是聚合吗?或者可能是地图减少或者它可能会出现什么?

提前致谢

1 个答案:

答案 0 :(得分:0)

The $all operator selects the documents where the value of a field is an array that contains all the specified elements.

https://docs.mongodb.com/master/reference/operator/query/all/

db.Test6.count({pages: {$all: [111, 999]}}); // 2
db.Test6.count({pages: {$all: [000, 222, 999]}}); // 1

Related to the Ordered check, my suggestion is to suppose that the Array is already ordered (this will make the query more easy/fast to do).

In order to have the Array sorted, you should assure that when you push the element: https://docs.mongodb.com/master/reference/operator/update/sort/#up._S_sort