在mongoDB中使用数组索引获取数组元素

时间:2012-11-30 19:55:36

标签: arrays mongodb find

考虑在mongoDB中进行以下收集:

{a:[4,2,8,71,21]}
{a:[24,2,2,1]}
{a:[4,1]}
{a:[4,2,8,21]}
{a:[2,8,71,21]}
{a:[4,2,8]}

如何以最轻松的方式获得以下结果:

获取数组的第n个元素

{a:4}
{a:24}
{a:4}
{a:4}
{a:2}
{a:4}

获取元素2到4

{a:[8,71,21]}
{a:[2,1]}
{a:[]}
{a:[8,21]}
{a:[71,21]}
{a:[8]}

以及其他类似的查询。

1 个答案:

答案 0 :(得分:6)

您要找的是$slice projection

从数组的开头获取许多元素

你可以传递一个带有多个值的简单$limit来返回(例如1):

> db.mycoll.find({}, {_id: 0, a: { $slice: 1}})
{ "a" : [ 4 ] }
{ "a" : [ 24 ] }
{ "a" : [ 4 ] }
{ "a" : [ 4 ] }
{ "a" : [ 2 ] }
{ "a" : [ 4 ] }

获取一系列元素

您可以传递参数为($skip$limit)的数组。

注意:要匹配您的预期输出,您必须找到元素3到5(跳过前2个元素,返回下3个元素):

> db.mycoll.find({}, {_id: 0, a: { $slice: [2,3]}})

{ "a" : [ 8, 71, 21 ] }
{ "a" : [ 2, 1 ] }
{ "a" : [ ] }
{ "a" : [ 8, 21 ] }
{ "a" : [ 71, 21 ] }
{ "a" : [ 8 ] }

获取数组的第n个元素

将元素数量传递给$ skip,将值设置为1。

例如,要查找第二个元素,您需要跳过1个条目:

> db.mycoll.find({}, {_id: 0, a: { $slice: [1,1]}})

{ "a" : [ 2 ] }
{ "a" : [ 2 ] }
{ "a" : [ 1 ] }
{ "a" : [ 2 ] }
{ "a" : [ 8 ] }
{ "a" : [ 2 ] }

请注意$slice运算符:

  • 始终返回数组
  • 将为匹配查找条件的文档返回一个空数组,但返回$ slice选择的空结果(例如,如果您要求只有2个元素的数组的第5个元素)