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

3
考虑以下在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}

获取第二到第四个元素
{a:[8,71,21]}
{a:[2,1]}
{a:[]}
{a:[8,21]}
{a:[71,21]}
{a:[8]}

以及其他类似的查询。

1个回答

7
你需要的是 $slice 投影

从数组开头获取多个元素

你可以通过传递一个简单的 $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个元素)

谢谢。如果我想要获取一个标量值:{'a':'x'}而不是 {'a':['x']}。 - Handsome Nerd
1
$slice 运算符总是返回一个数组。我不认为在 MongoDB 2.2 中有语法来将单个简单数组元素投影为标量。您可以通过 MapReduce 实现这一点,但与仅在应用程序代码中将 $slice 返回的单个元素数组转换为标量相比,这似乎过于复杂。如果您的数组包含嵌入式文档,并且您想要匹配特定值(而不是数组位置),则可以使用 $elemMatch 投影 来返回第一个匹配的元素。 - Stennie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接