使用MongoDB从单独集合中的文档聚合多个字段
我使用下面的代码来显示两个独立集合字段的结果:InfoMovie和Rate,它们之间的公共字段是MID。我想要一个结果集,使用Mongodb将集合“InfoMovie”中的“Actors”和集合“Rate”中的“remark”显示到一个resltset中。但当我执行下面的代码时,它只显示“备注”列表,但不显示备注的演员姓名。[注:本系列中的所有演员均未加注释。其中很少有人加注释。我们只需显示被注释演员的姓名。] 如果有人能解决这个问题,我将非常感激。先谢谢你!:) 以下是示例文档: 收集infoMovie的示例文档:使用MongoDB从单独集合中的文档聚合多个字段,mongodb,mongodb-query,aggregation-framework,non-relational-database,Mongodb,Mongodb Query,Aggregation Framework,Non Relational Database,我使用下面的代码来显示两个独立集合字段的结果:InfoMovie和Rate,它们之间的公共字段是MID。我想要一个结果集,使用Mongodb将集合“InfoMovie”中的“Actors”和集合“Rate”中的“remark”显示到一个resltset中。但当我执行下面的代码时,它只显示“备注”列表,但不显示备注的演员姓名。[注:本系列中的所有演员均未加注释。其中很少有人加注释。我们只需显示被注释演员的姓名。] 如果有人能解决这个问题,我将非常感激。先谢谢你!:) 以下是示例文档: 收集info
{
"MID":"1",
"MovieName":"Iron man",
"Actors":"RDJ",
"RDate":"2008",
"Country":"USA",
},
{
"MovieID":"2",
"MovieName":"Dark Knight",
"Actors":"Christian Bail",
"RDate":"2007",
"Country":"USA",
}
我使用的mongod版本是3.4.7。谢谢大家!
收款率样本文件:
{
"MID":1,
"ReviewedBy":"John",
"Rate":4,
"Date":"10/04/2013",
"remark":"The best Movie ever!",
},
{
"MID":2,
"ReviewedBy":"William",
"Rate":8,
"Date":"19/06/2014",
}
你可以在下面试试 您需要使用聚合过滤掉
备注
等于未定义的文档
db.InfoMovie.aggregate([
{ "$lookup": {
"from":"Rate",
"localField":"MID",
"foreignField":"MID",
"as":"ActorsRating"
}},
{ "$project": {
"Actors": 1,
"Remark": {
"$filter": {
"input": "$ActorsRating",
"as": "ac",
"cond": { "$ne": ["$$ac.remark", undefined] }
}
}
}}
])
项目阶段应该是这样的$project:{“备注”:“$actorstrating”,“Actors”:1}但它也给出了未备注的电影的结果。我们怎么能不展示那些没有被评论的呢?无论如何,谢谢。好的,那么你能发布这两个系列的样本文档并提及你的mongodb版本吗?你好,先生!我已经添加了文件的代码。你能看一下吗!我们可以通过集合“rate”中的属性“remark”来识别。集合“Rate”由集合“InfoMovie”中的几个电影名称组成,备注栏包含对已备注和未备注电影的备注。是否可以将InfoMovie中的演员姓名和Rate中的备注显示为结果集?感谢您的回复。@Rocky,出于性能原因,最好升级到v3.6或更高版本,因为您可以利用“备注”字段上的索引,将
$match
阶段移动到$lookup
管道中。@dnickless是的,但OP不在3.6上。是的,不用担心,这就是为什么我写道,如果他能升级就好了。然后我想你们应该对这个问题发表评论:)
db.InfoMovie.aggregate([
{ "$lookup": {
"from":"Rate",
"localField":"MID",
"foreignField":"MID",
"as":"ActorsRating"
}},
{ "$project": {
"Actors": 1,
"Remark": {
"$filter": {
"input": "$ActorsRating",
"as": "ac",
"cond": { "$ne": ["$$ac.remark", undefined] }
}
}
}}
])