猫鼬$切片并获得原始大小数组

时间:2018-09-06 08:32:07

标签: javascript node.js mongodb mongoose

我目前正在尝试获取“新闻”对象中的项目总数,并将其中一部分作为对象返回。 我发现了如何在查询中使用$ slice运算符,但是我不知道如何获取项目数组的原始大小。 我目前在NodeJS中使用的代码:

if (req.query.limit) {
    limit = 5;
}
News.findOne({ connected: club._id }, {items: {$slice: limit}}).exec(function (err, news) {
    if (err) {
        return res.status(400).send({
            message: errorHandler.getErrorMessage(err)
        });
    } else if (!news || news.items.length === 0) {
        res.jsonp([]);
    } else {
        const returnObj = { items: [], totalNumber: 0 };
        const items = news.items.sort(function (a, b) {
            return b.date - a.date
        });
        res.jsonp({
            items: items,
            totalNumber: news.items.length
        });
    }
});

Mongo模型:

 var mongoose = require('mongoose'),
 validator = require('validator'),
 Schema = mongoose.Schema;

 var NewsSchema = new Schema({
 connected: {
  type: Schema.Types.ObjectId,
  required: 'Gelieve een club toe te wijzen.',
  ref: 'Club'
 },
 items: [{
  userFirstName: String,
  action: String,
  date: Date,
  targetName: String
 }],
 created: {
  type: Date,
  default: Date.now
 }
});

module.exports = mongoose.model('News', NewsSchema);

我将如何有效地做到这一点?

谢谢!

编辑:有效的最终代码:

News.aggregate([{
    $match: {
        connected: club._id
    }
}, {
    $project: {
        totalNumber: {
            $size: '$items'
        },
        items: {
            $slice: ['$items', limit]
        }
    }
}
]).exec(function (err, news) {
    console.log(news);
    if (!news || news[0].items.length === 0) {
        res.jsonp([]);
    } else {
        res.jsonp(news[0]);
    }
});

1 个答案:

答案 0 :(得分:2)

使用find$slice不能同时拥有这两个信息。


您拥有的解决方法


使用aggregate返回count,仅返回sliced值。

赞:

[{
   $project: {
     count: {
        $size: "$params",
     },

     params: {
        $slice: ["$params", 5],
     },
   },
}]

为帮助您制作aggregate,可以使用很棒的mongodb-compass软件及其aggregate实用工具。

enter image description here


使用不带find的{​​{1}},获取那里的项数,然后在返回数组之前在JavaScript数组中使用$slice



编辑:

slice