MongoDB Aggregate - 放松、分组和项目

Posted

技术标签:

【中文标题】MongoDB Aggregate - 放松、分组和项目【英文标题】:MongoDB Aggregate - Unwind, group and project 【发布时间】:2014-10-30 03:39:14 【问题描述】:

使用集合Users,是否可以检索以下唯一的组织/所有者列表?如果当前的设置不可行,是否可以通过一个查询从两个 ID 链接的集合中获得相同的结果?

目前,使用 Mongoose 我只能检索组织名称组:

当前查询

userModel.aggregate([ $unwind:'$organisations' , $group: name: '$organisations.name' ])


用户

 "_id" : ObjectId("53f4a94e7c88310000000001"), 
  "email" : "bob@example.com",
  "organisations" : [
    
      "name" : "OrgOne", 
      "isOwner" : true
    
  ]
,
 "_id" : ObjectId("53f4a94e7c88310000000002"), 
  "email" : "ash@something.com",
  "organisations" : [
    
      "name" : "OrgOne"
    
  ]
,
 "_id" : ObjectId("53f4a94e7c88310000000003"), 
  "email" : "george@hello.com",
  "organisations" : [
    
      "name" : "OrgTwo", 
      "isOwner" : true
    
  ]


结果

 "orgName" : "OrgOne", 
  "owner" : 53f4a94e7c88310000000001
,
 "orgName" : "OrgTwo", 
  "owner" : 53f4a94e7c88310000000003

提前致谢,尼克

【问题讨论】:

【参考方案1】:

对我来说似乎是一种奇怪的聚合用法,但这里每个用户可能有几个“组织”,所以我想我会继续:

userModel.aggregate(
    [
         "$match":  "organisations.isOwner": true  ,
         "$unwind": "$organisations" ,
         "$match":  "organisations.isOwner": true  ,
         "$group":  
            "_id": "$organisations.name",
            "owner":  "$first": "$_id" 
         
    ],
    function(err,result) 

    
);

如果有多个所有者并且您需要一些优先级,那么您可以在组之前实现 $sort。或者只是 $project 而不是为了吸引所有人而进行分组。

【讨论】:

感谢您的回答,但这似乎返回了一个空结果。有什么想法吗? 如果每个用户只有一个组织会更简单,那么这是一个明确的考虑因素。 @NickPrice Typo “组织”整天都在谈论美国 非常感谢。之前没有使用过$first 运算符。非常感谢!

以上是关于MongoDB Aggregate - 放松、分组和项目的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose/Mongodb Aggregate - 对多个字段进行分组和平均

mongoDB高级篇①聚集运算之group与aggregate

mongodb聚合命令

MongoDB聚合(aggregate)

mongodb 聚合操作

MongoDB根据时间aggregate示例