MongoDB获取部分文档

时间:2014-05-08 09:35:29

标签: 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条评论

{ 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
                              })

但如果至少有一个类型为admin的项目存在,则返回空洞注释数组。

2 个答案:

答案 0 :(得分:4)

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

db.collection.aggregate([ 
  { $match: {_id: "1"} }, 
  { $unwind: "$comments" }, 
  { $match: { "comments.type": "admin" } },
  { $sort: { "comments.id": -1 } }, 
  { $limit: 5 } 
])

这将生成_id="1"的最后5条评论列表:

{ "_id" : "1", "title" : "abc", "comments" : { "id" : "7", "type" : "admin" } }
{ "_id" : "1", "title" : "abc", "comments" : { "id" : "6", "type" : "admin" } }
{ "_id" : "1", "title" : "abc", "comments" : { "id" : "5", "type" : "admin" } }
{ "_id" : "1", "title" : "abc", "comments" : { "id" : "4", "type" : "admin" } }
{ "_id" : "1", "title" : "abc", "comments" : { "id" : "3", "type" : "admin" } }

答案 1 :(得分:0)

您可以使用$elemMatch运算符:

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