Mongoose填充选项限制,如何限制子文件的数量?

时间:2016-06-03 08:08:59

标签: mongodb mongoose

我有查询要查找帐户并填写帐户的子文档。

当我使用填充路径时:" order"限制选项将起作用。但是如果我使用填充路径" orders.order",则选项限制将不起作用。

我该怎么办?

我的架构如下:

  var AccountSchema = new mongoose.Schema({

    _id:id,
    orders:{type:[{
      order:{type: mongoose.Schema.Types.ObjectId, ref:'Order'}
    }]}
  });


var findOrderByUserId = function(accountId,index,count,callback){
  var limit = index*count;
  console.log(limit);
  Account.findOne({_id:accountId}).populate({
    path:'orders.order',//If path is orders, then limit will work

    options:{
      limit:limit
    }
  }).exec(function (err, doc) {
              if (err) {
                console.log(err);
                callback(err);
              }
              console.log(doc);
                var array = [];
                for(var i=limit - count;i<doc.orders.length;i++){
                    if(doc.orders[i]!=null){
                        array.push(doc.orders[i]);            
                    }
                    else{
                      break;
                    }
                }
              callback(doc);
          })
}

2 个答案:

答案 0 :(得分:4)

limit仅适用于顶级文档,用于控制需要使用$slice的文档内的数组,这意味着您需要重建查询,如下所示(mongo shell):

db.posts.find( {}, { comments: { $slice: 5 } } )

请参阅this post了解更多信息 - 例如:

query.slice('comments', 5)
// or...
query.where('comments').slice(5)

manual

答案 1 :(得分:2)

对于谁也可能关注这个问题,我注意到在使用猫鼬群时切片很棘手。

例如,我们有两个名为UserGroupModel和UserModel

的模型
()

现在我们想在UserGroup中填充用户,出于性能考虑,我们只想要所有用户的最后一个,比方说20个。

这里,像这样的代码不起作用

var UserGroupSchema = new mongoose.Schema({
    users:[{type:mongoose.Schema.Types.ObjectId,ref:'User'}],
    groupName:String
})

var UserSchema = new mongoose.Schema({
    username:String
})

你会注意到切片功能不起作用

你必须改为

UserGroupModel.findById(userGroupId)
    .populate('users', 'username')
    .slice('users', -20)
    .select('users')
    .lean()
    .exec(function(err, group){})

主要观点是如果你想用人口进行切片,你必须使用排除

PS “猫鼬”: “4.4.15”