我在JSON中有两本不同的收藏书和音乐。首先我给出一本书籍收藏示例:
header {
&, a {color: white}
}
玛丽写了3本书,乔写了2本书,托尼写了1本书。其次,我给出了一个音乐收藏示例:
{
"_id" : ObjectId("b1"),
"author" : [
"Mary",
],
"title" : "Book1",
}
{
"_id" : ObjectId("b2"),
"author" : [
"Joe",
"Tony",
"Mary"
],
"title" : "Book2",
}
{
"_id" : ObjectId("b3"),
"author" : [
"Joe",
"Mary"
],
"title" : "Book3",
}
.......
Tony有2个音乐,Joe有1个音乐,Mary有0个音乐。
我希望得到的作者数量超过音乐。
因此,玛丽(3> 0)和乔(2> 1)应该考虑,但不是托尼(1< 2)。因此,最终结果应为2(玛丽和乔)。
我写下以下代码,但不知道如何比较:
{
"_id" : ObjectId("m1"),
"author" : [
"Tony"
],
"title" : "Music1",
}
{
"_id" : ObjectId("m2"),
"author" : [
"Joe",
"Tony"
],
"title" : "Music2",
}
.......
这是对的吗?如何进行以下比较?感谢。
答案 0 :(得分:0)
要解决这个问题,我们需要在中间集合中使用$ out out和两个查询的结果,然后使用聚合查询来加入它们($ lookup)。
db.books.aggregate([{
$project : {
_id : 0,
author : 1
}
}, {
$unwind : "$author"
}, {
$group : {
_id : "$author",
count : {
$sum : 1
}
}
}, {
$project : {
_id : 0,
author : "$_id",
count : 1
}
}, {
$out : "bookAuthors"
}
])
db.music.aggregate([{
$project : {
_id : 0,
author : 1
}
}, {
$unwind : "$author"
}, {
$group : {
_id : "$author",
count : {
$sum : 1
}
}
}, {
$project : {
_id : 0,
author : "$_id",
count : 1
}
}, {
$out : "musicAuthors"
}
])
db.bookAuthors.aggregate([{
$lookup : {
from : "musicAuthors",
localField : "author",
foreignField : "author",
as : "music"
}
}, {
$unwind : "$music"
}, {
$project : {
_id : "$author",
result : {
$gt : ["$count", "$music.count"]
},
count : 1,
}
}, {
$match : {
result : true
}
}
])
编辑更改:
使用了作者字段而不是_id
在$ project阶段
中添加了文档中嵌入的逻辑语句结果:{$ gt:[“$ count”,“$ music.count”]
欢迎提出任何问题! 玩得开心!