草庐IT

mongodb - 在特定文档上放松

coder 2023-11-05 原文

我有一个帐户集合,其中有关帖子的详细信息被非规范化。在每个账户文档中,都有一个页面字段,它是一个包含帖子信息的子文档数组。每个帖子文档都有一个标签字段,给定一个帐户 ID,我正在尝试使用适当的标签分组获取帐户中的页面,唯一的问题是,我希望将分组文档作为未分组文档的 sibling 。

示例:

{
_id : "account1",
pages : [
    {
      title : "New Page"
      tag : "novel",
    },
    {
      title : "Another New Page"
      tag : "novel",
    },
    {
      title : "One more New Page"
    }
]
}

我的查询是这样的

db.accounts.aggregate([
                {
                    $match : {
                        _id : "account1"
                    }
                },
                { 
                    $unwind: "$pages" 
                }, 
                { 
                    $project: {
                        pages: 1,
                        tag: {
                            $ifNull : ["$pages.tag", "unassigned"]
                        }
                    }
                }, 
                { 
                    $group: { 
                        _id: "$tag", 
                        pages: { 
                            $push: "$pages" 
                        } 
                    } 
                }
])

目前,输出看起来像这样

{
   "_id" : "novel",
   "pages" : [
    {
      title : "New Page"
      tag : "novel",
    },
    {
      title : "Another New Page"
      tag : "novel",
    }
   ]
},
{
  "_id" : "unassigned",
  "pages" : [
    {
      title : "One more New Page"
      tag : "unassigned",
    }
   ]
}

但是我需要打开这个未分配的分组,输出应该是这样的

{
   "_id" : "novel",
   "pages" : [
    {
      title : "New Page"
      tag : "novel",
    },
    {
      title : "Another New Page"
      tag : "novel",
    }
   ]
},
{
   title : "One more New Page"
}

最佳答案

下面的查询可以得到我们预期的输出:

db.accounts.aggregate([
    {
        $match : {
            _id : "account1"
        }
    },
    { 
        $unwind: "$pages" 
    }, 
    { 
        $project: {
            pages: 1,
            tag: {
                $ifNull : ["$pages.tag", "unassigned"]
            }
        }
    }, 
    { 
        $group: { 
            _id: "$tag", 
            pages: { 
                $push: "$pages" 
            } 
        } 
    },
    {  
        $addFields:{
            "data":{
                $cond:[
                    {
                        $eq:["$_id","unassigned"]
                    },
                    "$pages",
                    []
                ]
            }
        }
    },
    {
        $unwind:{
            "path":"$data",
            "preserveNullAndEmptyArrays":true
        }
    },
    {
        $addFields:{
            "data":{
                $cond:[
                    {
                        $eq:["$_id","unassigned"]
                    },
                    "$data",
                    "$$ROOT"
                ]
            }
        }
    },
    {
        $replaceRoot:{
            "newRoot":"$data"
        }
    }
]).pretty()

数据集:

{
    "_id" : "account1",
    "pages" : [
        {
            "title" : "New Page",
            "tag" : "novel"
        },
        {
            "title" : "Another New Page",
            "tag" : "novel"
        },
        {
            "title" : "One more New Page"
        },
        {
            "title" : "New page 2"
        },
        {
            "title" : "New page 3"
        }
    ]
}

输出:

{ "title" : "One more New Page" }
{ "title" : "New page 2" }
{ "title" : "New page 3" }
{
    "_id" : "novel",
    "pages" : [
        {
            "title" : "New Page",
            "tag" : "novel"
        },
        {
            "title" : "Another New Page",
            "tag" : "novel"
        }
    ]
}

说明:页面根据标签分组后,未分配的页面投影为新字段data。然后我们将展开数组。稍后,带有标签的文档也被分配给 data 字段,即 data 现在包含未分配的页面和分配的页面组。最后,我们可以将 data 投影为根文档。

关于mongodb - 在特定文档上放松,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57774992/

有关mongodb - 在特定文档上放松的更多相关文章

  1. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  2. Ruby - 如何在读取文件时跳过/忽略特定行? - 2

    在读取/解析文件(使用Ruby)时忽略某些行的最佳方法是什么?我正在尝试仅解析Cucumber.feature文件中的场景,并希望跳过不以Scenario/Given/When/Then/And/But开头的行。下面的代码有效,但它很荒谬,所以我正在寻找一个聪明的解决方案:)File.open(file).each_linedo|line|line.chomp!nextifline.empty?nextifline.include?"#"nextifline.include?"Feature"nextifline.include?"Inorder"nextifline.include?

  3. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  4. Ruby 等同于 Sphinx 文档生成器? - 2

    Ruby有一些不错的文档生成器,例如Yard、rDoc,甚至Glyph。问题是Sphinx可以做网站、PDF、epub、LaTex等。它在重组文本中完成所有这些事情。在Ruby世界中有替​​代方案吗?也许是程序的组合?如果我也能使用Markdown就更好了。 最佳答案 自1.0版以来,Sphinx有了“域”的概念,它是从Python和/或C以外的语言标记代码实体(如方法调用、对象、函数等)的方法。有一个rubydomain,所以你可以只使用Sphinx本身。您唯一会缺少的(我认为)是Sphinx使用autodoc从源代码自动创建文档

  5. ruby-on-rails - Ruby on Rails - 需要在每周的特定时间将消息发送到电子邮件 - 2

    我想知道我应该如何着手这个项目。我需要每周向人们发送一次电子邮件。但是,这必须在每周的特定时间自动生成并发送。编码有多难?我需要知道是否有任何书籍可以提供帮助,或者你们中的任何人是否可以指导我。它必须使用ruby​​onrails进行编程。因此有一个网络服务和数据库集成。干杯 最佳答案 为什么这么复杂?您只需安排工作。您可以使用Delayed::Job例如。Delayed::Job让您可以使用run_at符号在特定时间安排作业,如下所示:Delayed::Job.enqueue(SendEmailJob.new(...),:run_

  6. ruby-on-rails - 如果特定语言环境中缺少翻译,如何配置 i18n 以使用 en 语言环境? - 2

    如果特定语言环境中缺少翻译,如何配置i18n以使用en语言环境翻译?当前已插入翻译缺失消息。我正在使用RoR3.1。 最佳答案 找到相似的question这里是答案:#application.rb#railswillfallbacktoconfig.i18n.default_localetranslationconfig.i18n.fallbacks=true#railswillfallbacktoen,nomatterwhatissetasconfig.i18n.default_localeconfig.i18n.fallback

  7. ruby-on-rails - 在 irb 中阅读文档 - 2

    我怀念ipython的一件事是它有一个?为特定功能挖掘文档的运算符。我知道ruby​​有一个类似的命令行工具,但是我在irb中调用它非常不方便。ruby/irb有类似的东西吗? 最佳答案 Pry是IPython的Ruby版本,它支持?命令来查找有关方法的文档,但语法略有不同:pry(main)>?File.dirnameFrom:file.cinRubyCore(CMethod):Numberoflines:6visibility:publicsignature:dirname()Returnsallcomponentsofthef

  8. ruby - 根据要求使用特定的 VCR 磁带 - 2

    情况:使用Rspec、FactoryGirl和VCR测试Rails应用程序。每次创建用户时,都会通过Stripe的API创建关联的Stripe客户。测试时,添加VCR.use_cassette或describe"...",vcr:{cassette_name:'stripe-customer'}do...到涉及用户创建的每个规范。我的实际解决方案如下:RSpec.configuredo|config|config.arounddo|example|VCR.use_cassette('stripe-customer')do|cassette|example.runendendend但这是

  9. ruby - 使用 Nokogiri 和 Ruby 从 html 文档获取链接和 href 文本? - 2

    我正在尝试使用nokogirigem提取页面上的所有url及其链接文本,并将链接文本和url存储在散列中。FooBar我想回去{"Foo"=>"#foo","Bar"=>"#bar"} 最佳答案 这是一个单行:Hash[doc.xpath('//a[@href]').map{|link|[link.text.strip,link["href"]]}]#=>{"Foo"=>"#foo","Bar"=>"#bar"}拆分一点可以说更具可读性:h={}doc.xpath('//a[@href]').eachdo|link|h[link.t

  10. ruby - 从特定索引开始迭代数组 - 2

    我想从特定索引开始遍历数组。我该怎么做?myj.eachdo|temp|...end 最佳答案 执行以下操作:your_array[your_index..-1].eachdo|temp|###end 关于ruby-从特定索引开始迭代数组,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/44151758/

随机推荐