MongoDB 查询以查找具有共同值的字段和 return 这些字段的所有详细信息

MongoDB query to find fields with common value and return all the details of those fields

我有一个MongoDBcollection如下:

Collection:电影

[
      {"_id": 0,title: "Movie A",  year: 2010, director: "D1", actors: ["A1","A2"] }
      ,{"_id": 1,title: "Movie B",  year: 2010, director: "D1", actors: ["A1","A5","A6"]}
      ,{"_id": 2,title: "Movie C",  year: 2010, director: "D2", actors: ["A4"]}
      ,{"_id": 3,title: "Movie D",  year: 2012, director: "D3", actors: ["A7"]}
      ,{"_id": 4,title: "Movie E",  year: 2015, director: "D3", actors: ["A7"]}
]

我想return同一导演的所有电影细节,也就是共同导演的记录。

结果应该是这样的:

 {"_id": 0,title: "Movie A",  year: 2010, director: "D1", actors: ["A1","A2"] },
 {"_id": 1,title: "Movie B",  year: 2010, director: "D1", actors: ["A1","A5","A6"]},
 {"_id": 3,title: "Movie D",  year: 2012, director: "D3", actors: ["A7"]},
 {"_id": 4,title: "Movie E",  year: 2015, director: "D3", actors: ["A7"]}

我试过这个:

db.movies.aggregate([{$group:{_id:"$director",count : {$sum : 1}}},{$match:{"count":{$gt:1}}},])

得到了结果:

{ "_id" : "D3", "count" : 2 }
{ "_id" : "D1", "count" : 2 }

但不知道下一步该做什么?

  • $group by director, 求和得到总数并构造rootDocs 属性
  • 中所有电影的数组
  • $match过滤count大于1的文档
  • $unwind解构rootDocs数组
  • $replaceRootrootDocs 对象替换为 root
db.collection.aggregate([
  {
    $group: {
      _id: "$director",
      count: { $sum: 1 },
      rootDocs: { $push: "$$ROOT" }
    }
  },
  { $match: { count: { $gt: 1 } } },
  { $unwind: "$rootDocs" },
  { $replaceRoot: { newRoot: "$rootDocs" } }
])

Playground

您可以在我们执行以下管道阶段的地方使用以下聚合:

  1. 组:将相同导演的电影放在一起

  2. 匹配:寻找共同的导演,即导演应该至少有 2 部电影

  3. 展开:因为你需要single/original条记录所以我们需要unwind/ungroup条记录

  4. 项目:以预期格式获得结果会将分组数据映射到原始模式。

     [{$group: {
    _id: '$director',
    commonDirector: {
     $addToSet: '$$ROOT'
    },
    count:{$sum:1}
    }}, {$match: {
    count: {$gt:1}
    }}, {$unwind: {
    path: '$commonDirector',
    preserveNullAndEmptyArrays: false
    }}, {$project: {
     _id: '$commonDirector._id',
    title: '$commonDirector.title',
    year:'$commonDirector.year',
    director:"$commonDirector.director",
    actors:'$commonDirector.actors'
    }}, {
    $sort: {
     director: 1,
     title:1
       }
    }]
    

然后它会按照您想要的方式生成结果:

 {"_id": 0,title: "Movie A",  year: 2010, director: "D1", actors: ["A1","A2"] },
 {"_id": 1,title: "Movie B",  year: 2010, director: "D1", actors: ["A1","A5","A6"]},
 {"_id": 3,title: "Movie D",  year: 2012, director: "D3", actors: ["A7"]},
 {"_id": 4,title: "Movie E",  year: 2015, director: "D3", actors: ["A7"]}