Arrays MongoDB获取文档的部分数组

Arrays MongoDB获取文档的部分数组,arrays,mongodb,partial,slice,Arrays,Mongodb,Partial,Slice,数据结构: { _id: '1', 'title: 'Blabla', comments: [ {id:'3', type:'normal'} , {id: '4', type: 'admin'}, {id: '5', type: 'admin'}, {id: '6', type: 'admin'} ] } 我试图得到的是类型的最后5条评论的数组admin: { com

数据结构:

{
  _id: '1',
  'title: 'Blabla',
  comments: [ {id:'3', type:'normal'} , 
              {id: '4', type: 'admin'}, 
              {id: '5', type: 'admin'}, 
              {id: '6', type: 'admin'}
            ]
}
我试图得到的是类型的最后5条评论的数组admin

{ comments: [{id:4, type:'admin'}, {id: '5', type: 'admin'}, {id: '6', type: 'admin'}] } 
我所尝试的:

db.collection('posts').find({_id: '1', 'comments.type':'admin'}
                             , {
                               comments:{$slice: -5}, 
                               comments:1, _id:0
                              })
但是,如果至少存在1个类型为admin的项,则返回孔注释数组。

您可以使用运算符:

db.collection('posts').find(
    {
        _id: '1',
    },
    {
        comments: {
            $elemMatch: {
                'type': 'admin'
            }
        }
    }
)
您可以使用运算符:

db.collection('posts').find(
    {
        _id: '1',
    },
    {
        comments: {
            $elemMatch: {
                'type': 'admin'
            }
        }
    }
)

您可以尝试使用聚合框架:

db.collection.aggregate([ 
  { $match: {_id: "1"} }, 
  { $unwind: "$comments" }, 
  { $match: { "comments.type": "admin" } },
  { $sort: { "comments.id": -1 } }, 
  { $limit: 5 } 
])
这将为
\u id=“1”
生成最后5条注释的列表:


您可以尝试使用聚合框架:

db.collection.aggregate([ 
  { $match: {_id: "1"} }, 
  { $unwind: "$comments" }, 
  { $match: { "comments.type": "admin" } },
  { $sort: { "comments.id": -1 } }, 
  { $limit: 5 } 
])
这将为
\u id=“1”
生成最后5条注释的列表:



(已编辑)实际上它只提供了数组的第一个class='admin'元素。是否有方法返回数组中的多个元素?@dyk还没有,聚合框架是针对该特定元素的purpose@dyk是的,我同意为此您应该使用聚合框架(已编辑)实际上,它只提供了数组的第一个class='admin'元素。是否有方法返回数组中的多个元素?@dyk还没有,聚合框架是针对该特定元素的purpose@dyk是的,我同意为了这个目的,你应该使用聚合框架。是通过增加ID定义的最新版本吗?或者它们只是由它们在数组中的位置来定义的?那么接受的答案实际上就不起作用了,它将得到最新的5,这取决于如何实现我的目标的任何建议?这是我得到的最接近的建议:在一天结束时,你可能会发现这样做更好的应用程序sideOk我发现了一些东西:Stennie那里的答案显示使用未记录的运算符
$const
添加包含数组索引到每个元素,当他将其分组备份时,您可以对其进行排序,然后继续Sebastian回答:最新的定义是通过递增ID吗?或者它们只是由它们在数组中的位置来定义的?那么接受的答案实际上就不起作用了,它将得到最新的5,这取决于如何实现我的目标的任何建议?这是我得到的最接近的建议:在一天结束时,你可能会发现这样做更好的应用程序sideOk我发现了一些东西:Stennie那里的答案显示使用未记录的运算符
$const
添加包含数组索引到每个元素,当他将其分组备份时,您可以对其进行排序,然后继续Sebastians回答我明白了,虽然它确实有效,但它是性能的一个好选择吗?如果我得到孔阵列,并在节点中运行“for”循环以满足我的需要,它会变慢吗?优点是Mongo不需要将数据发送到客户端来执行操作。因此,在数据库中这样做会更快。MongoDB会将所有内容加载到内存中,第二个$match是在$unwind之后,因此整个文档都会加载到内存中。请看,虽然它可以工作,但它是性能的好选择吗?如果我得到孔阵列,并在节点中运行“for”循环以满足我的需要,它会变慢吗?优点是Mongo不需要将数据发送到客户端来执行操作。因此在数据库中这样做会更快。MongoDB会将所有内容加载到内存中,第二个$match是在$unwind之后,因此整个文档都会加载到内存中