草庐IT

mongodb - 在 MongoDB 中基于 ID 对两个集合执行连接

coder 2024-07-09 原文

我有两个集合:评分和预订。

在预订集合中,我有一个字段“_id”,它是正常的文档 ID。我还在预订集合中保存了一个字段“location_id”。在收视率收集中,我将预订的 ID 引用为“booking_id”字段。

查询 1:

我想根据“location_id”计算评分,这意味着首先我需要根据 location_id 获取预订,然后我需要找到该预订的评分(位置为“location_id”) .

为此,我通过像这样聚合两个集合来执行 MongoDB 连接:

    getCollection := mongoSession.DB(config.Database).C(config.RatingsCollection)
    pipe := getCollection.Pipe([]bson.M{ 
                                        bson.M{"$match": bson.M{"location_id": 2}},
                                        bson.M{"$lookup": bson.M{
                                                            "localField"    : "booking_id",
                                                            "from"          : config.BookingsCollection,
                                                            "foreignField"  : "_id"}},
                                        bson.M{"$count": "ratings_count"}, })
    err = pipe.All(&result)

查询2:

我还需要知道如何向我们的查询添加更多条件(将在同一个集合中应用)??

我需要执行此连接操作查询以及一些其他条件,例如在评级集合中我有另一个字段,如“rating_date”,其中包含时间戳值。

condition :=  bson.M{}
condition["review_date"] = bson.M{"$gte": startDate, "$lte": endDate} 
allratingsCount, err := models.GetRatingsCount(condition)

func GetRatingsCount(query interface{}) (int, error){
    count, err := GetRecordsCount(config.RatingsCollection, query)
    if err != nil{
        return 0, err
    }
    return count, err
}

喜欢在代码中,我需要发送另一个带有连接查询的条件。我可以同时执行这两件事吗?

提前致谢。

最佳答案

我找到了问题的答案。这是在两个不同的集合上进行复杂的 JOIN 操作以获取单一的评分计数:

getCollection := mongoSession.DB("example_db").C("ratings")
    pipe := getCollection.Pipe([]bson.M{ 
                                        bson.M{"$lookup": bson.M{
                                                            "localField"    : "booking_id",
                                                            "from"          : "bookings",
                                                            "foreignField"  : "_id",
                                                            "as"            : "data" }},
                                        bson.M{"$unwind": "$data"},
                                        bson.M{"$match": bson.M{"location_id": 1, "industry_id": 2, "proivder_id": 10, "rating": 4.5, "rating_date": bson.M{ "$gte": startDate, "$lte": endDate}}},
                                        bson.M{"$group": bson.M{
                                                            "_id": "null", 
                                                            "count": bson.M{"$sum": 1} } } } )
    err = pipe.One(&result) 

通过这种方式,我通过将两个集合连同不同的查询连接在一起来计算评分数。

关于mongodb - 在 MongoDB 中基于 ID 对两个集合执行连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46421549/

有关mongodb - 在 MongoDB 中基于 ID 对两个集合执行连接的更多相关文章

  1. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  2. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  3. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  4. ruby - Chef 执行非顺序配方 - 2

    我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul

  5. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  6. ruby - 为什么 Ruby 的 each 迭代器先执行? - 2

    我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试

  7. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

  8. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

  9. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  10. ruby-on-rails - rbenv:从 RVM 移动到 rbenv 后,在 Jenkins 执行 shell 中找不到命令 - 2

    我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions

随机推荐