Tag: aggregation framework

如何聚合数组中ObjectID的出现次数?

我有两个集合; users和communities 。 我的用户可以链接到许多社区,所以我已经将linkedCommunities作为用户架构中的数组来链接,如下所示: const userSchema = new Schema({ linkedCommunities: [ { type: mongoose.Schema.ObjectId, ref: 'Community' } ] }); 在我的communities视图中,我想显示链接到每个社区的users数量,因此它会显示如下内容: | Community | Number of users | | ——— | ————— | | Community 1 | 45 | | Community 2 | 78 | | Community 4 | 107 | 理想情况下,当我在Community模型上查找时,我想要一个名为linkedUserCount的字段。 我敢肯定,我可以用某种方式来实现这一点,但我正在努力寻找合适的pipe道运营商和订单。

Mongodb聚合嵌套组

我已经在我的collections中分配了人员,状态,就像下面一样 [ {"ASSIGN_ID": "583f84bce58725f76b322398", "STATUS": 1}, {"ASSIGN_ID": "583f84bce58725f76b322398","STATUS": 4}, {"ASSIGN_ID": "583f84bce58725f76b322398","STATUS": 4}, {"ASSIGN_ID": "583f84bce58725f76b322398","STATUS": 3}, {"ASSIGN_ID": "583f84bce58725f76b322311","STATUS": 1}, {"ASSIGN_ID": "583f84bce58725f76b322311","STATUS": 3}, {"ASSIGN_ID": "583f84bce58725f76b322322","STATUS": 1}, {"ASSIGN_ID": "583f84bce58725f76b322322","STATUS": 4} ] 我想通过ASSIGN_ID将这些数据分组,并在每个状态的STATUS计数内与下面相同。 [ { "ASSIGN_ID":"583f84bce58725f76b322398", "STATUS_GROUP":[ { "STATUS":1, "COUNT":1 }, { "STATUS":3, "COUNT":1 }, { "STATUS":4, "COUNT":2 } ] }, { "ASSIGN_ID":"583f84bce58725f76b322311", "STATUS_GROUP":[ { "STATUS":1, "COUNT":1 }, { […]

在MongoDB中使用Aggregation框架交集数组

我有一个与模式(mongoose)集合说: { name : String, age : Number, params : [Number] // eg : params = [1,21,45,32,0] , usually they are very small arrays } 这个集合有1000个这种types的文档 说,我有一个baseParams = [1,20,30,4,7]; 我想要使​​用聚合,并findparams包含的baseParams数组中的最大数量的文档的id,如max(对于每个doc交集(baseParams,params)) 我最后需要按年龄sorting的前五名文件的_id:1 任何想法的人?

在mongodb的聚合里面调用函数?

采集: [ { _id: "Foo", flag1: false, flag2: true, flag3: false }, { _id: "Bar", flag1: true, flag2: false, flag3: true } ] 我的问题是,是否有可能调用聚合查询内的方法? aggregate({ $project: { '_id': 1, 'status' MyService.getStatus($flag1, $flag2, $flag3) } }); 如果可能的话,它的语法是什么? 结果: [ { _id: "Foo", status: 'ok' }, { _id: "Bar", status: 'broken' } ] 在我的真实世界的应用程序,我有10个布尔标志每个文件。 如果用户得到这个文件,我想转换标志并赋予它们一个含义(对于用户)。 例如考虑一个文件代表一个轮胎。 flag1 […]

如何使用聚合在mongo中根据子字段查找父母?

这里是我有一个代码: const _ = require('lodash') const Box = require('./models/Box') const boxesToBePicked = await Box.find({ status: 'ready', client: 27 }) const boxesOriginalIds = _(boxesToBePicked).map('original').compact().uniq().value() const boxesOriginal = boxesOriginalIds.length ? await Box.find({ _id: { $in: boxesOriginalIds } }) : [] const attributes = ['name'] const boxes = [ …boxesOriginal, …boxesToBePicked.filter(box => !box.original) ].map(box => _.pick(box, attributes)) 比方说,我们在“箱子”集合中有以下数据: […]

如何在Mongoose / node中获得平均评分

我有一个在angularjs的前端工作的星级评定指令,我可以保存评级收集评级。 这里是我的评级架构/模型: var mongoose = require('mongoose'); module.exports = mongoose.model('Rating', { bourbonId: {type: mongoose.Schema.ObjectId, ref: 'Bourbon'}, userId: {type: mongoose.Schema.ObjectId, ref: 'User'}, rating: {type: Number, required: true}, ratingId : {type: mongoose.Schema.ObjectId} }); 以下是我需要的平均评分: 'use strict'; var mongoose = require('mongoose'), BourbonSchema = null; module.exports = mongoose.model('Bourbon', { BourbonId: {type: mongoose.Schema.ObjectId}, name: {type: String, required: true}, blog: {type: String, […]

将string转换为聚合中的数字

我正在寻找一种方法来使用Mongoose的聚合pipe道来汇总数据。 我有一个模式,看起来像这样: var Object = new Schema ({ Object2 : { type : ObjectId, ref : 'Object2' }, Object3 : { type : ObjectId, ref : 'Object3' }, value : {}, unit : String }) “值”字段通常是一个数字,但我允许用户在转换数字的字段中包含文本。 因此,值被存储为一个string,然后我把它转换成一个数字。 我不能把它作为一个数字存储,因为没有办法将它转换回用户的显示。 我一直试图执行一个Mongoose $ sumpipe道来总结这些值,同时仍然允许我转换数字。 这是我试过的: data.aggregate([ { $match: { $and: [{Object2: mongoose.Types.ObjectId(id)}, {Object3: {$in: sessions.map(function(this){ return new mongoose.Types.ObjectId(this._id); […]

使用$ group阶段和$ sum运算符进行聚合

我想使用聚合和小组阶段来总和所有“总计”字段值。 我的代码和文件在这里 文件 { "_id": "57a068477b2l51ec16eb7das", "userID":"5742c6eedsaadsd93573e", "profileID":"5742aee49adv520593573c", "date": 1470130247779, "updateDate": 1470130361342, "total": 2 } { "_id": "57a068477b2l51ec16eb983", "userID":"5742c6eedsaadsd93573e", "profileID":"5742aee49adv520593573c", "date": 1470130247779, "updateDate": 1470130361342, "total": 1 } 我正在做下面的查询获取“总”值的总和 RecallProfile.aggregate([ { "$match": { "updateDate": { "$gte": from, "$lte": to } } }, { $group: { "_id": "$updateDate", "totalRecord": {"$sum": "$total"} } } ], function (err, result) […]

如何正确使用函数populate()

我使用函数.populate()来获取按category分组的equipements ,所以我的模型是这样的 var mongoose = require('../config/db'); var EquipementSchema = mongoose.Schema({ libelle: String, marque: String, category: { type: mongoose.Schema.Types.ObjectId, ref: 'Category' } }); module.exports = mongoose.model('Equipement', EquipementSchema); 路线: router.get('/categorie_id', function(req, res, next){ models.equipement.aggregate([ { $group : { _id : '$categorie_id', equipements: { $push: '$$ROOT' } } } ].exec(function(err , results){ if(err) res.json({error: err}); res.json(results); })); }); […]

mongoose聚合:两个不同的$组相同的$匹配

我想使用相同的filter执行两个聚合函数。 我可以做到以下几点: // create first aggregate query var query1 = myModel.aggregate([ { $match: myMatchCriteria }, { $group1: myGroupCriteria1 } ]); // create second aggregate query var query2 = myModel.aggregate([ { $match: myMatchCriteria }, { $group2: myGroupCriteria2 } ]); // execute both queries query1.exec(myCallback); query2.exec(myCallback); 但它似乎并不理想:据我所知,$匹配使用find(),所以我会查询我的数据库两次相同的输出。 有没有办法“保存”find()结果,然后将聚合应用到它们? 就像是: var myFilteredDocuments = myModel.find(myMatchCriteria); var query1 = myFilteredDocuments.aggregate([{ […]