gpt4 book ai didi

mongodb - 比较mongodb中的两个集合

转载 作者:行者123 更新时间:2023-12-05 07:49:57 26 4
gpt4 key购买 nike

我在 JSON 中有两个不同的收藏书籍和音乐。首先我举一个书籍收藏示例:

{
"_id" : ObjectId("b1"),
"author" : [
"Mary",
],
"title" : "Book1",
}
{
"_id" : ObjectId("b2"),
"author" : [
"Joe",
"Tony",
"Mary"
],
"title" : "Book2",
}
{
"_id" : ObjectId("b3"),
"author" : [
"Joe",
"Mary"
],
"title" : "Book3",
}
.......

玛丽写了 3 本书,乔写了 2 本书,托尼写了 1 本书。其次我举一个音乐收藏的例子:

 {
"_id" : ObjectId("m1"),
"author" : [
"Tony"
],
"title" : "Music1",
}
{
"_id" : ObjectId("m2"),
"author" : [
"Joe",
"Tony"
],
"title" : "Music2",
}
.......

托尼有 2 首音乐,乔有 1 首音乐,玛丽有 0 首音乐。

希望得到写书多于音乐的作者数量。

因此,应该考虑 Mary(3 > 0) 和 Joe(2 > 1),而不是 Tony(1 < 2)。因此最终结果应该是 2(Mary and Joe)。

我写下了下面的代码,但不知道如何比较:

db.book.aggregate([ 
{ $project:{ _id:0, author:1}},
{ $unwind:"$author" },
{$group:{_id:"$author", count:{$sum:1}}}
]
)

db.music.aggregate([
{ $project:{ _id:0, author:1}},
{ $unwind:"$author" },
{$group:{_id:"$author", count:{$sum:1}}}
]
)

到目前为止正确吗?如何进行以下比较?谢谢。

最佳答案

为了解决这个问题,我们需要使用 $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
}
}
])

EDIT CHANGES:

used author field instead of _id

added logical statement embeded in document in $project phase

result : { $gt : ["$count", "$music.count"]

欢迎提问!玩得开心!

关于mongodb - 比较mongodb中的两个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36681668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com