Tag: aggregation framework

mongodb聚合:平均和sorting

我是一个新手,并有一个MongoDB聚合的问题。 我用mongoose。 var SubjectScore = new Schema({ name: {type:String, required:true}, //math, science, history, … score: {type:Number, required:true } // 95, 85, 77,…. }); var Subject = new Schema({ year: Number, //2012, 2013, 2014 subjectScore : [SubjectScore] }); var StudentSchema = new Schema({ name: String, subject: [Subject], //array length varies for each student profile: String, }); […]

我如何使用mongoose/ mongodb在单个查询中应用$ match,$ group和$ sum

我正在尝试用我对MongoDB的基本知识来find解决scheme。 我有像下面的数据 { _id: 45556, "name": "John", "gender": "male", "lunch_preference":[ {"outlet":"KFC", "day":"monday", "spent":300}, {"outlet":"Mc", "day":"friday", "spent":250}, {"outlet":"dominos", "day":"sunday", "spent":400} ] } { _id: ab123, "name": "Peter", "gender": "male", "lunch_preference":[ {"outlet":"dominos", "day":"tuesday", "spent":150}, { "outlet":"Mc", "day":"wednesday", "spent":350}, {"outlet":"dominos", "day":"sunday", "spent":300} ] } 在这里,我正在过滤数据使用$match我的查询过滤: db.lunch.aggregate([{"$unwind":"$lunch_preference"}, {$match: {"lunch_preference.outlet": "dominos"}},{$match: {"lunch_preference.day": "sunday"}}]) 这个查询工作正常! 现在我想计算(花费的总和)上述过滤数据的花费,所以我申请如下。 db.lunch.aggregate([{"$unwind":"$lunch_preference"}, {$match: {"lunch_preference.outlet": "dominos"}}, {$match: […]

Mongoose / mongodb – 每个ID只获取最新的logging

我有mongoose的检测模型: var InspectionSchema = new Schema({ business_id: { type: String, required: true }, score: { type: Number, min: 0, max: 100, required: true }, date: { type: Number, // in format YYYYMMDD required: true }, description: String, type: String }); InspectionSchema.index({business_id: 1, date: 1}, {unique: true}); 对同一个业务可能有多个检查(每个业务由一个唯一的business_id表示)。 但是,每个商家每天都有一次检查的限制,这就是为什么business_id +date有唯一的索引。 我还在Inspection对象上创build了一个静态方法,在给定business_ids列表的情况下,检索所有基础业务的检查。 InspectionSchema.statics.getAllForBusinessIds = function(ids, callback) { […]

MongoDB使用mongoose驱动程序:如何查询文档的数组属性的子集?

我收集了选民登记资料。 这些forms如下: voter = { name: "Some name", registrationDate: "2015-10-21T15:41:36+00:00", votingHistory: ["2015-10-21T15:41:36+00:00", "2015-7-21T15:41:36+00:00"] } 我需要能够检测投票历史数组的一个子集的大小。 例如,这是我试过的一个问题: voters.find({ votingHistory : { $all : {$size : { $gt : 8 }}, { $gt : "2015-7-21T15:41:36+00:00" }} }) 这个查询的意图是在2015年7月21日之后find所有至less有8个logging投票的选民。 有mongoose的方式来查询数组属性的子集的大小吗? 例如,有以下三个条目: { name: "name1", VotingHistory: ["2015-10-21T15:41:36+00:00", "2013-7-21T15:41:36+00:00"] }, { name: "name2", VotingHistory: ["2015-10-21T15:41:36+00:00", "2011-7-21T15:41:36+00:00"] }, { name: "name3", […]

$ sort在聚合pipe道mongodb中无效$ skip

我正在使用聚合来查询用户。 每个后续请求都使用$ skip获取下一组结果,如下所示。 var aggPipeline = [ locationMatch, userToUsersMatch, usersToUserMatch, { $skip:cursor }, { $limit:perRequest } ] 这工作正常,并返回用户,直到没有剩下的回报。 当我将$ sort添加到stream水线中时,$ skip似乎停止工作,并且在每个后续请求中都会返回重复数据(即使光标/偏移量递增)。 aggPipeline = [ locationMatch, userToUsersMatch, usersToUserMatch, { $sort:{lastActive:-1} }, { $skip:cursor }, { $limit:perRequest } ] 我试图通过lastActive字段sorting所有结果,然后返回它们,跳过已经返回的偏移量。 我无法理解为什么$ sort会导致重复数据在随后的调用中返回 – 它并不总是从前一个请求重复,但可以每隔一段时间附加一个用户并删除第一个用户。 任何人都知道这里发生了什么? 非常感谢。

Mongodb:在指定的时间之间获取文档,而不考虑date

假设Mongodb数据库中的示例文档如下所示: { "date" : ISODate("2015-11-09T05:58:19.474Z") } { "date" : ISODate("2014-10-25T07:30:00.241Z") } { "date" : ISODate("2015-11-30T15:24:00.251Z") } { "date" : ISODate("2012-01-10T18:36:00.101Z") } 预期: { "date" : ISODate("2015-11-09T05:58:19.474Z") } { "date" : ISODate("2014-10-25T07:30:00.241Z") } Iam感兴趣的是查找“date”字段在04:15和07:40之间的文件,而不pipedate,月份和年份。 间接查询必须匹配date字段中的任何“YYYY-MM-DDT”。 我的方法是,从节点查询所有文档中的所有文档,然后查询匹配查询的每个文档,比较文档的“date”字段与“yyyy-MM-DDT”+“required_time”(“YYYY-通过使用moment.js模块将MM-DD从每个文档的“date字段”中复制,以便通过转换为moment()并获取月份,date和年份来进行比较。 有没有什么方法可以直接得到相同的结果? 注意:我正在使用nodejs连接到mongodb 这个问题是基于Mongodb:基于ISODate格式的查询 。

在总输出中组合不同的分组总计

现在我已经在$ project,aggregate()和$ group这个周末敲了一下头,现在是时候让我再次投入到你的仁慈之中。 我正在尝试拨打电话,回复用户的总数,按性别分组(这是比较容易的部分),并根据年龄段进行分组(这是击败了我)。 我得到它与一个小组合作: Person.aggregate([ { $match: { user_id: id } }, { $group: { _id: '$gender', total: { $sum: 1 } } } ]) .exec(function(err, result) { etc… 从那以后,它会给我多less男人,有多less女人在一个不错的输出中。 但是,如果我join第二组,似乎跳过第一个,扔第二组: Person.aggregate([ { $match: { user_id: id } }, { $group: { _id: '$gender', total: { $sum: 1 } }, $group: { _id: '$age', […]

如何传递variables来聚合(匹配)与Mongoose和NodeJS?

我有这样的文件: { "_id" : 1, "time": { "start": ISODate("2016-01-18T00:12:41.000Z"), "end": ISODate("2016-01-18T05:12:41.000Z") }, "subject":"javascript", "class": "ABC" } … 我有客户端/服务器应用程序,客户端将发送请求到服务器有四个variables: timeS , timeE , sub , class 。 他们可能是空的string。 在我的服务器中,如何编写聚合查询来查找匹配过滤条件的logging? 我想忽略空的search项。 var query = db.collection.aggregate([ {"$match": {"$and":[]}} ]); 例: 如果timeS不是空的,我想$match $eq 。 如果timeS和timeE都不是空的,我想$match $gte:timeS, $lte:timeE 。

select字段的值作为数组mongoose / mongodb聚合

我有一个mongo查询 db.memberships.aggregate([{ '$match': { unit: new ObjectId('566fbaa1e63225b10bacac44') } }, { '$lookup': { from: 'seasons', localField: 'season', foreignField: '_id', as: 'season' } }, { '$unwind': '$season' }, { '$project': { season: { 'name': '$season.name', 'id': '$season._id' } } }, { '$group': { _id: '$_id', 'season': { '$addToSet': '$season' } } }, ]); 哪个结果 [ { "_id": […]

MongoDB:聚合$项目采取数组当前项目

嗨,我有这样的MongoDB查询。 .aggregate( [ { $match : { comment_box : "somdata" } }, { $project : { comment : 1, created_at: 1, current_date: "$replies.created_at", }, dateDifference: { $subtract: [ new Date(), "$created_at"] } }}, ] ) 想象一下,我想从当前date字段的回复数组中获取created_at值。 但是这个查询返回 current_date: [ "2016-03-08T13:48:27.882Z", "2016-03-08T14:26:22.194Z" ] 而不是此数组中每个元素的当前created_at值 我尝试了很多方法,但有错误 current_date: "$replies.0.created_at", current_date: "$replies.$.created_at", current_date: "$$replies.created_at", 等等 请帮我检索这样的数据 current_date:"2016-03-08T13:48:27.882Z",