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
数组
$replaceRoot
将 rootDocs
对象替换为 root
db.collection.aggregate([
{
$group: {
_id: "$director",
count: { $sum: 1 },
rootDocs: { $push: "$$ROOT" }
}
},
{ $match: { count: { $gt: 1 } } },
{ $unwind: "$rootDocs" },
{ $replaceRoot: { newRoot: "$rootDocs" } }
])
您可以在我们执行以下管道阶段的地方使用以下聚合:
组:将相同导演的电影放在一起
匹配:寻找共同的导演,即导演应该至少有 2 部电影
展开:因为你需要single/original条记录所以我们需要unwind/ungroup条记录
项目:以预期格式获得结果会将分组数据映射到原始模式。
[{$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"]}
我有一个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
bydirector
, 求和得到总数并构造rootDocs
属性 中所有电影的数组
$match
过滤count大于1的文档$unwind
解构rootDocs
数组$replaceRoot
将rootDocs
对象替换为 root
db.collection.aggregate([
{
$group: {
_id: "$director",
count: { $sum: 1 },
rootDocs: { $push: "$$ROOT" }
}
},
{ $match: { count: { $gt: 1 } } },
{ $unwind: "$rootDocs" },
{ $replaceRoot: { newRoot: "$rootDocs" } }
])
您可以在我们执行以下管道阶段的地方使用以下聚合:
组:将相同导演的电影放在一起
匹配:寻找共同的导演,即导演应该至少有 2 部电影
展开:因为你需要single/original条记录所以我们需要unwind/ungroup条记录
项目:以预期格式获得结果会将分组数据映射到原始模式。
[{$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"]}