比较mongodb中的两个集合

时间:2016-04-17 20:12:25

标签: mongodb

我在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",
    }
    .......

这是对的吗?如何进行以下比较?感谢。

1 个答案:

答案 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”]

欢迎提出任何问题! 玩得开心!