Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript mongoose-聚合数据_Javascript_Mongodb_Mongoose - Fatal编程技术网

Javascript mongoose-聚合数据

Javascript mongoose-聚合数据,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,我正试图找出如何使用聚合和mongoose,代码如下: const Model = db.model(which, schema) var regex = new RegExp(name, "g") const query = Model .find({ name: regex }) .where("user_id").equals(req.sessio

我正试图找出如何使用
聚合
和mongoose,代码如下:

    const Model = db.model(which, schema)
    var regex = new RegExp(name, "g")
    const query =
        Model
            .find({
                name: regex
            })
            .where("user_id").equals(req.session.user.id)

    if (except) 
    {
        if (Array.isArray(except))
        {
            query
                .where("_id").nin(except)
        }
        else 
        {
            query
                .where("_id").neq(except)
        }
    }  

    return await
        query
            .skip(start)
            .limit(finish)
            .lean()
            .exec()

我想做的是得到总数(不受限制)。当然,我可以删除
skip
limit
并使用
count
,然后再次运行它,但我认为聚合在这种情况下是合适的?

您可以尝试下面的聚合

db.collection.aggregate([
  { "$facet": {
    "data": [
      { "$match": {
        "name": { "$regex": name },
        "user_id": mongoose.Types.ObjectId(req.session.user.id),
        "_id": { "$nin": except }
      }},
      { "$skip": start },
      { "$limit": finish }
    ],
    "count": [
      { "$match": {
        "name": { "$regex": name },
        "user_id": mongoose.Types.ObjectId(req.session.user.id),
        "_id": { "$nin": except }
      }},
      { "$count": "count" }
    ]
  }}
])
要执行一次(链),请执行以下操作:


这里什么是
除了
?@AnthonyWinzlet
除了
就是一个字符串或一个数组,应该是一个单数id或一个要排除的id列表,仅此而已。应该将其强制放入数组中,这样我就可以在
nin
中使用它。我可能会在以后将此标记为答案,因为我仍在进行测试设置,以便可以自动执行一些测试插入。这只是部分答案。我还想做一个
总计
,因此涉及到
$count
的东西,您必须使用
$facet
聚合。。。更新了答案是否在匹配部分使用
$project
保存重复代码?否您不能。。。两者都是不同的操作“数据”和“数据计数”。。。但它不会影响你的表现
        Model
            .aggregate()
            .match({
                "name": { "$regex": name },
                "user_id": ObjectId(req.session.user.id),
                "_id": { "$nin": except }
            })
            .facet({
                "results": [
                    { "$skip": start },
                    { "$limit": finish },
                    {
                        "$project": {
                            "map_levels": 0,
                            "template": 0
                        }
                    }
                ],
                "count": [
                    { "$count": "total" },
                ]
            })
            .exec()