草庐IT

mongodb - 那个领域不一样的Mongo投影领域

coder 2023-11-05 原文

那里

我的问题可能很困惑。让我进一步解释一下。

我有这样的聚合文档。

{
  "metric" : "user_act",
  "stream_id" : "f00001",
  "values" : {
    "likes" : 57,
    "comments" : 0,
    "shares" : 0
  }
}
{
    "metric" : "user_act",
    "stream_id" : "f00002",
    "values" : {
      "likes" : 28,
      "comments" : 0,
      "shares" : 1
    }
}

{
    "metric" : "user_act",
    "stream_id" : "t00001",
    "values" : {
      "favorites" : 5,
      "retweets" : 15
    }
}

我想通过点赞、评论和分享的总和来计算参与度。所以在计算之前,我必须在分组之前投影数据。我想将 values.favorites 映射到 likes,将 values.retweets 映射到 sharescomments 如果没有任何数据集默认为 0。

我尝试像下面这样的投影但不起作用,因为 $ifNull 第二行的值覆盖了第一行。

{
  $project: {
    "stream_id" : 1, 
    "shares": {
      $ifNull: ["$values.retweets",0],
      $ifNull: ["$values.shares", 0]
    } ,
    "likes": {
      $ifNull: ["$values.favorites",0],
      $ifNull: ["$values.likes", 0]
    } ,
    "comments": {
      $ifNull: ["$values.replys",0],
      $ifNull: ["$values.comments", 0]
    }
  }
}

有人知道吗?先谢谢你。

[更新] 我尝试像这样投影,但在 case: 中不起作用,我如何检查该字段是否存在?

{
  $project: {
    "stream_id" : 1,
      "shares": {
        $switch: {
          branches: [
            { case: {$ne: ["$values.retweets", 0]},
              then: {$ifNull: ["$values.retweets", "$values.retweets"]}
            },
            { case: {$ne: ["$values.shares", 0]},
              then: {$ifNull: ["$values.shares", "$values.shares"]}
            }
          ],
          default: 0
        }
      }
  }
}

最佳答案

你可以试试$cond投影。

db.collection.aggregate({
  $project: {
    "stream_id" : 1, 
    "shares": { $cond: [ { $eq:[ { $ifNull: [ "$values.shares", 0 ] }, 0 ] },{ $ifNull: [ "$values.retweets", 0 ] }, "$values.shares" ] },
    "likes": { $cond: [ { $eq:[ { $ifNull: [ "$values.likes", 0 ] }, 0 ] }, { $ifNull: [ "$values.favorites", 0 ] }, "$values.likes" ] },
    "comments": { $cond: [ { $eq:[ { $ifNull: [ "$values.comments", 0] }, 0 ] }, { $ifNull: [ "$values.replys", 0 ] }, "$values.comments" ] }
}})

使用$switch

db.collection.aggregate([{
  $project: {
    "stream_id" : 1,
      "shares": {
        $switch: {
          branches: [
            { case: { $ifNull: [ "$values.shares", false ] },
              then: "$values.shares"
            },
           { case: { $ifNull: [ "$values.retweets", false ] },
              then: "$values.retweets"
            }],
          default: 0
        }
      }
  }
}])

关于mongodb - 那个领域不一样的Mongo投影领域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43024819/

有关mongodb - 那个领域不一样的Mongo投影领域的更多相关文章

  1. ruby - Ruby gsub 替换中的行为不一致? - 2

    两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio

  2. ruby - 可以像在 C# 中使用#region 一样在 Ruby 中使用 begin/end 吗? - 2

    我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用

  3. java - Java 中的 "caller"和 Ruby 中的 "receiver"一样吗? - 2

    如果我说x.hello()在Java中,对象x正在“调用”它包含的方法。在Ruby中,对象x正在“接收”它包含的方法。这只是表达相同想法的不同术语,还是意识形态上的根本差异?来自Java,我发现Ruby的“接收器”想法非常令人困惑。也许有人可以解释这与Java的关系? 最佳答案 在您的示例中,x不调用hello()。包含该片段的任何对象都是“调用”(即,它是“调用者”)。在Java中,x可以称为接收者;它正在接收对hello()方法的调用。 关于java-Java中的"caller"和R

  4. ruby - Sass: errno::enoent: 没有那个文件或目录 - 2

    我知道这是一个非常平淡的错误,但我在Sass3.4.2中遇到了一个常规的“找不到文件”错误:/*Errno::ENOENT:Nosuchfileordirectory-dumdum.scssBacktrace:/Library/Ruby/Gems/2.0.0/gems/sass-3.4.12/lib/sass/plugin/compiler.rb:482:in`read'/Library/Ruby/Gems/2.0.0/gems/sass-3.4.12/lib/sass/plugin/compiler.rb:482:in`update_stylesheet'/Library/Ruby/

  5. ruby - 为什么 Gemfile 语义版本控制运算符 (~>) 会产生与一个数字不一致的结果? - 2

    gemspec语义版本控制运算符~>(又名twiddle-wakka,又名pessimistic运算符)允许限制gem版本但允许进行一些升级。我经常看到它可以读作:"~>3.1"=>"Anyversion3.x,butatleast3.1""~>3.1.1"=>"Anyversion3.1.x,butatleast3.1.1"但是有了一个数字,这条规则就失效了:"~>3"=>"Anyversionx,butatleast3"*NOTTRUE!*"~>3"=>"Anyversion3.x"*True.Butwhy?*如果我想要“任何版本3.x”,我可以只使用“~>3.0”,这是一致的。就

  6. Ruby AWS::S3::S3Object (aws-sdk):是否有与 aws-s3 一样的流式数据方法? - 2

    在aws-s3中,有一种方法(AWS::S3::S3Object.stream)可让您将S3上的文件流式传输到本地文件。我无法在aws-sdk中找到类似的方法。即在aws-s3中,我这样做:File.open(to_file,"wb")do|file|AWS::S3::S3Object.stream(key,region)do|chunk|file.writechunkendendAWS::S3:S3Object.read方法确实将block作为参数,但似乎没有对其执行任何操作。 最佳答案 aws-sdkgem现在支持S3中对象的分

  7. 从零开始学习Linux运维,成为IT领域翘楚(二) - 2

    文章目录🔥Linux系统目录结构🔥Linux用户和用户组🔥Linux用户管理🔥Linux系统目录结构文件系统组织结构⭐ /lib系统开机所需要最基本的动态链接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。⭐ /lost+found一般情况下是空的,当系统非法关机后,这里就存放了一些文件。⭐ /etc所有系统管理所需要的配置文件和子目录my.conf⭐ /usr用户的很多应用程序和文件都放在这个目录下。⭐ /bin是Binary的缩写,这个目录存放着经常使用的命令⭐ /sbin(usr/sbin、/usr/local/sbin)sbin就是peruse

  8. 设计一个亿级高并发系统架构 - 12306火车票核心场景DDD领域建模 - 2

    “架设一个亿级高并发系统,是多数程序员、架构师的工作目标。许多的技术从业人员甚至有时会降薪去寻找这样的机会。但并不是所有人都有机会主导,甚至参与这样一个系统。今天我们用12306火车票购票这样一个业务场景来做DDD领域建模。”开篇要实现软件设计、软件开发在一个统一的思想、统一的节奏下进行,就应该有一个轻量级的框架对开发过程与代码编写做一定的约束。虽然DDD是一个软件开发的方法,而不是具体的技术或框架,但拥有一个轻量级的框架仍然是必要的,为了开发一个支持DDD的框架,首先需要理解DDD的基本概念和核心的组件。一.什么是领域驱动设计(DDD)首先要知道DDD是一种开发理念,核心是维护一个反应领域概

  9. c# - Ruby 是否像 C# 一样具有 Skip(n)? - 2

    在C#中你可以这样做:varlist=newList(){1,2,3,4,5};list.skip(2).take(2);//returns(3,4)我正在尝试学习所有Ruby可枚举方法,但我没有看到skip(n)的等效方法a=[1,2,3,4,5]a.skip(2).take(2)#takeexists,skipdoesn't那么,“最好的”Ruby方法是什么?所有这些都有效,但它们非常丑陋。a.last(a.length-2).take(2)(a-a.first(2)).take(2)a[2...a.length].take(2) 最佳答案

  10. sql - Rails 3 Sum 两个领域的产品 - 2

    我需要计算我的Rails3应用中两个字段的乘积之和(即相当于Excel的sumproduct函数)。Rails中是否有一种方法可以帮助解决这个问题?如果没有,那么使用自定义sql的Rails代码是什么?例如,酒店有很多房间。房间具有sqft(平方英尺)、数量(该尺寸)和hotel_id的属性。我想计算给定酒店中所有房间的总平方英尺。在SQL中,对于Hotel.id=8,我相信以下语句会起作用:selectsum(rooms.sqft*rooms.quantity)asSumSqftfromroomsinnerjoinhotelsonrooms.hotel_id=hotels.idwhe

随机推荐