生成聚合结构

2024-04-08

所以这里有一个问题。我想要做的是根据一组输入值生成一个数据结构。

由于这是多语言提交,因此我们将输入列表视为键/值对数组。因此,还有一系列哈希、映射、字典或任何能让您满意的术语。我将在这里将所有符号保留为 JSON,希望它具有足够的通用性来翻译/解码。

对于输入,假设我们有这样的:

[ { "4": 10 }, { "7": 9 }, { "90": 7 }, { "1": 8 } ] 

也许有点多余,但让我们坚持下去。

因此,根据该输入,我想了解这个结构。我给出了一个完整的结构,但是重要的部分是返回的值"weight":

[
   { "$project": {
       "user_id": 1,
       "content": 1,
       "date": 1,
       "weight": { "$cond": [
           { "$eq": ["$user_id": 4] },
           10,
           { "$cond": [ 
               { "$eq": ["$user_id": 7] },
               9,
               { "$cond": [
                   { "$eq": ["$user_id": 90] },
                   7,
                   { "$cond": [
                       { "$eq": ["$user_id": 1] },
                       8, 
                       0
                   ]}
               ]}
           ]}
       ]}
   }}
]

因此,我正在寻找的解决方案通过使用来填充“权重”的结构内容,如结构中所示input如图所示。

是的,这些价值观看起来像结构中的数字必须是数字而不是字符串,因此无论语言实现如何,JSON 编码版本must看起来一模一样。

交替,给我一个更好的方法来获得与分配相同的结果weight基于匹配的值user_id.

有人对此有办法吗?

我会对任何语言实现感到满意,因为我认为看看如何创建结构是公平的。

我会尝试添加自己,但值得称赞的是良好的实现。

快乐编码。


当我有时间思考这个问题时,我跑回家使用 Perl 并解决了这个问题:

use Modern::Perl;

use Moose::Autobox;
use JSON;

my $encoder = JSON->new->pretty;

my $input = [ { 4 => 10 }, { 7 => 9 }, { 90 => 7 }, { 1 => 8 } ];

my $stack = [];

foreach my $item ( reverse @{$input} ) {

  while ( my ( $key, $value ) = each %{$item} ) {
    my $rec = {
      '$cond' => [
        { '$eq' => [ '$user_id', int($key) ] },
        $value
      ]
    };

    if ( $stack->length == 0 ) {
      $rec->{'$cond'}->push( 0 );
    } else {
      my $last = $stack->pop;
      $rec->{'$cond'}->push( $last );
    }

    $stack->push( $rec );
  }

}

say $encoder->encode( $stack->[0] );

所以这个过程非常简单。

  1. 遍历数组中的每个项目并获取该条目的键和值

  2. 创建一个新的“文档”,其中“$cond”键的数组参数仅包含所需三个条目中的两个。这些是分配给测试“$user_id”的值和返回的“权重”值。

  3. 测试外部变量的长度stack,如果它是空的(第一次通过)那么push的价值0如文档中“$cond”键末尾的最后一个嵌套元素所示。

  4. 如果已经有东西存在(长度> 0),则取该值并push它作为文档的“$cond”键中的第三个值。

  5. 将该文档作为以下值放回stack并重复下一个项目

因此,列表中有一些内容,例如反转输入的顺序,这不是必需的,但会在嵌套输出中产生自然顺序。另外,我对外部“堆栈”的选择是一个数组,因为测试运算符看起来很简单。但它实际上只是一个不断被重用、增强和替换的奇异值。

JSON 打印也只是为了显示输出。真正想要的是结果值stack合并到结构中。

然后我将逻辑转换为 ruby​​,就像 OP 使用的语言一样,我从那里获得了如何生成此嵌套结构的灵感:

require 'json'

input = [ { 4 => 10 }, { 7 => 9 }, { 90 => 7 }, { 1 => 8 } ]

stack = []

input.reverse_each {|item|

  item.each {|key,value|
    rec = {
      '$cond' => [
        { '$eq' => [ '$user_id', key ] },
        value
      ]
    }

    if ( stack.length == 0 )
      rec['$cond'].push( 0 )
    else
      last = stack.pop
      rec['$cond'].push( last )
    end

    stack.push( rec )
  }

}

puts JSON.pretty_generate(stack[0])

然后最终进入最终形式以生成OP想要的管道:

require 'json'

userWeights = [ { 4 => 10 }, { 7 => 9 }, { 90 => 7}, { 1 => 8 } ]

stack = []

userWeights.reverse_each {|item|

  item.each {|key,value|
    rec = {
      '$cond' => [
        { '$eq' => [ '$user_id', key ] },
        value
      ]
    }

    if ( stack.length == 0 )
      rec['$cond'].push( 0 )
    else
      last = stack.pop
      rec['$cond'].push( last )
    end

    stack.push( rec )
  }

}

pipeline = [
    { '$project' => {
        'user_id' => 1,
        'content' => 1,
        'date' => 1,
        'weight' => stack[0]
    }},
    { '$sort' => { 'weight' => -1, 'date' => -1 } }
]

puts JSON.pretty_generate( pipeline )

因此,这是一种生成要传递到聚合的结构的方法,以便应用特定于某个对象的“权重”user_id并对集合中的结果进行排序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生成聚合结构 的相关文章

  • 如何使用 Sails.js 和 Waterline 更新 MongoDB 子文档中的特定键?

    当尝试使用 Sails js 和 Waterline ORM 更新 MongoDB 子文档中的单个键时 我遇到了问题 这就是我的person js模型看起来像 module exports attributes name type stri
  • 猫鼬的深层填充

    我有两个模式 一张用于用户 另一张用于帖子 在用户模式中 我有latestPost的一个属性 它是帖子模式中条目的ObjectId 当我加载用户对象时 我想将 lastestPost 作为对象获取 其中包含用户架构中作者的用户名 其中作者是
  • 加密 mongodb 中的密码字段

    我有以下代码 它插入userName and password进入数据库 但密码以纯文本格式存储 我的意思是 当我查看数据库时 我可以看到插入的密码 我想存储password in encrypted format MongoClient
  • mongo objectid“包含”查询

    我想查询 MongoDB 数据库中的集合以查找包含部分 ObjectID 的所有记录 对于普通字符串 我可以使用如下正则表达式 db teams find some string 51eed 但是我该如何对 ObjectID 执行类似的操作
  • 更新插入 MongoDB 时如何防止出现“_t”字段?

    我有一个应用程序 它使用 MongoDB 的 C 驱动程序将 Upsert 插入 MongoDB 数据库 当我打电话给Update函数 我无法指定我要更新的类型 然后 t字段插入元素的类型 这是我用来更新插入的代码 collection U
  • mongorestore 从独立到复制集

    我已转储在默认端口上运行的独立 mongo 数据库 14Gb 大 如下所示 mongodump username
  • MongoDB:连接到 MongoDB 的 resolv.conf 的 DNS 问题

    我想从 MongoDB Atlas 导出一些数据 如果我执行下面的命令 它会尝试连接localhost并导出数据 mongoexport uri mongodb srv
  • Node.js 重用 MongoDB 参考

    我无法理解 Node js 例如 MongoDB 访问 这是我得到的 mydb js var mongodb require mongodb server new mongodb Server staff mongohq com 10030
  • node-mongodb-native的插入性能

    我正在使用 MongoDB 测试 Node js 的性能 我知道其中每一个都很好 彼此独立 但我正在尝试一些测试来感受它们 我遇到了这个问题 但无法确定来源 问题 我正在尝试在单个 Node js 程序中插入 1 000 000 条记录 它
  • NodeJS:将 JSON 保存到 MongoDB

    我正在尝试从 API 获取 JSON 并将其存储到 MongoDB 数据库中 显然 这是行不通的 我的应用程序似乎停留在我尝试将数据保存到数据库的位置 请告知该怎么做 这是我的代码 var express require express v
  • 如何使用 PyMongo 在重复键错误后继续插入

    如果我需要在 MongoDB 中插入尚不存在的文档 db stock update one document set document upsert True 将完成这项工作 如果我错了 请随时纠正我 但是 如果我有一个文档列表并想将它们全
  • 如何解决:“MongoError:此图集层不允许使用 $where”?

    使用 MongoDB Atlas 时如何解决 MongoError where is not allowed in this atlas tier 这是我的代码 async function getEventsTakingPlace con
  • 在 mongodb 和 nodejs 中对博客和评级进行建模

    我有一个博客集合 其中包含用户给予的标题 正文和综合评分 另一个集合 评级 其架构引用了博客 以对象 ID 的形式对博客进行评级 如果有的话 的用户以及他们给出的评级 即 1 或 1 当特定用户按照 最新优先 的顺序浏览博客时 比如每页 4
  • 按一个字段聚合,选择另一个字段最大值的文档作为集合

    使用聚合框架 获取每个分组的字段最大值的文档的最佳方法是什么 因此使用下面的集合 我希望具有为每个具有最新日期的 group id 返回一个文档的功能 第二个清单显示了所需的结果 group id date 1 11 1 12 1 11 2
  • 在 Nodejs 中,如何停止 FOR 循环直到 MongoDB 调用返回

    我正在研究下面的代码片段 我有一个名为 stuObjList 的 JSON 对象数组 我想循环遍历数组以查找具有特定标志集的特定 JSON 对象 然后进行数据库调用以检索更多数据 当然 FOR 循环不会等待数据库调用返回并到达 j leng
  • 一次更新猫鼬中的多个文档

    我有一个用户文档数组 每个用户都有关注者属性 它是一个数字 我只想将此属性增加 1 然后立即更新数据库中的所有这些用户文档 更多细节 在请求中 我有一组用户 id 我使用这些 id 进行查询以获取一组用户文档 const users awa
  • 最小验证在 Mongoose 中不起作用

    我有一个架构 其中余额字段的声明如下所示 balance type Number min 0 default 30 我将 0 设置为最小值 这样余额就不会为负值 但是当我通过更新查询减少余额值时 余额结果是负值 我的更新查询 User up
  • 减少从 MongoDB 加载大熊猫数据帧所使用的内存

    我有一个大型数据集 包含 4000 万条记录 总大小约为 21 0G 存储在 MongoDB 中 我花了几个小时将其加载到 pandas 数据框中 但总内存大小增加到约 28 7G 加载之前约为 600Mb cursor mongocoll
  • 如何在 Ubuntu VirtualBox 中运行 Meteor 应用程序并使用 Windows 主机上的编辑器进行编辑?

    我希望在运行 Ubuntu 的 virtualbox 来宾中运行一个用于开发目的的流星服务器 该项目将位于主机上的一个文件夹内 该文件夹将共享给来宾 该文件夹本身位于 Dropbox 文件夹内 这样我可以在多个虚拟机和工作站之间共享开发 但
  • MongoTemplate upsert - 从 pojo 进行更新的简单方法(哪个用户已编辑)?

    这是一个简单的 pojo public class Description private String code private String name private String norwegian private String en

随机推荐

  • 在内核中添加新的 IOCTL(数字范围)

    我正在编写新的内核模块 并添加实现新的 IOCTL IOCTL 的编号是否应该遵循任何规则 也许有一些 用户范围 我在嵌入式平台上使用内核 2 6 21 IOCTL 被定义为与设备相关的 如果有 标准 ioctls 供人们实现 这些将是像这
  • 如何在 Xamarin.Mac 中捕获应用程序级别的按键事件

    我有一个 Xamarin Forms 应用程序 并使用主窗口中的 PreviewKeyDown 事件成功捕获 WPF 中的应用程序级别按下事件 如何在 AppDelegate 或其他方式中对 Xamarin Mac 执行相同的操作 您可以添
  • 如何在先前输入后使用 C++ 中的“获取”函数?

    我尝试输入数据gets 函数 但每当程序执行到留置权时gets 它会忽略它 当我使用gets 没有之前的数据输入 它可以正常运行 但是当我在输入数据后使用它时 就会出现问题 这是在先前的数据输入之后使用它的代码 因此在执行中我无法将数据输入
  • 如何保护我的 AngularJS 和 Web Api 应用程序

    我在 ASP NET Web Api 服务器端使用 AngularJS 在我看来 身份验证现在已经变得轻而易举了 或者这太好了以至于令人难以置信 所以我正在考虑使用Web Api的 个人用户帐户 身份验证 我想这就是我所需要的 只要每个请求
  • Keras 张量 - 使用来自另一个张量的索引获取值

    假设我有这两个张量 valueMatrix 形状为 3 where 是批量大小 indexMatrix 形状为 1 我想从中检索值valueMatrix在包含的索引处indexMatrix 示例 伪代码 valueMatrix 7 15 5
  • ANTLR4 Lexer 错误报告(违规字符的长度)

    我正在使用 ANTLR4 为某些语言开发一个小型 IDE 并且需要在词法分析器无法匹配错误字符时给它们下划线 内置的org antlr v4 runtime ANTLRErrorListener http www antlr org api
  • 从 JavaScript 到 PHP 的数据传输

    如何获取 PHP 浏览器的高度和宽度 就像从 JavaScript 到 PHP 的数据传输一样 随着使用innerHeight and InnerWidth 我认为 如果用户屏幕尺寸小 我只需要显示小图片 如果屏幕尺寸大 我只需要显示大图片
  • PHP post方法无法从url获取数据

    我有一个 URL 用于在浏览器中粘贴并按 Enter 键后获取发布数据 我的链接是 http vtrails us mixtape builder song urls http vtrails us wp content uploads 2
  • 如何在 Unity3D 中编辑动画

    我在层次结构中选择了一个带有动画组件的游戏对象 不是动画师 而是一个简单的动画 然后我尝试通过从 窗口 菜单中选择 动画 来打开动画窗口来编辑它 问题是动画窗口变灰 建议我创建一个新动画 但我只想编辑我已经拥有的一个 要编辑动画 您需要选择
  • 在 Swift 中追加字符串

    我是 iOS 新手 我目前正在使用 Objective C 和 Swift 学习 iOS 要在 Objective C 中附加字符串 我使用以下代码 NSString string1 This is NSString string2 Swi
  • getIntent() 和从 savingInstanceState 获取意图有什么区别?

    大家好 我正在尝试 Android 在 2 个类之间传递意图 我意识到有 2 种传递意图的方法 第一个是在这里使用 getIntent 方法 Bundle extras getIntent getExtras mRowId extras n
  • 为什么强制转换为泛型类型会生效?

    On 重温Java http javarevisited blogspot tw 2011 09 generics java example tutorial html 代码摘录如下 class Holder
  • Tar 一个目录,但不要在存档中存储完整的绝对路径

    我在备份 shell 脚本的一部分中有以下命令 tar cjf site1 bz2 var www site1 当我列出存档的内容时 我得到 tar tf site1 bz2 var www site1 style css var www
  • Python tkinter 组合框

    当我单击组合框的名称而不使用 检查 等按钮来显示值时 我想填写我的条目 我怎样才能做到这一点 import tkinter as tk from tkinter import ttk import csv root tk Tk cb ttk
  • 当非模态时,展开 Segue 不会忽略自适应弹出框演示

    iOS 9 beta 更新 Apple 可能已针对 iOS 9 修复了此问题 如果您在 iOS 8 上解决了此问题 请确保它在 iOS 9 上也能正常工作 在故事板中 我创建了一个弹出框演示转场 以通过按钮呈现导航和视图控制器 并创建展开转
  • 动态 SQL 示例

    我最近了解了什么是动态 sql 它对我来说最有趣的功能之一是我们可以使用动态列名和表 但我无法思考现实生活中有用的例子 我唯一想到的是统计表 假设我们有一个包含名称 类型和created data 的表 然后我们想要一个表 其列中是从cre
  • 我可以在不更改系统 DPI 设置的情况下设置 Java Swing 应用程序的 DPI 分辨率吗?

    我有一个使用 Substance LookAndFeel 并以 Windows 作为目标平台的 Java 应用程序 我想增加应用程序的 DPI 设置without更改系统设置 我想这样做是因为我不想强迫用户重新启动 Windows 而且许多
  • git grep 按文件扩展名

    我知道 如果我只想在具有特定扩展名的文件上 grep 查找模式 我可以这样做 searches recursively and matches case insensitively in only javascript files for
  • 如何检查条件并将文本写入文本文件 oracle 表单

    我正在 Oracle Forms 中创建过程 其中检查验证数据并将数据插入表中 另请检查验证数据如果条件为真 则将一些文本写入文本文件 如果条件不为真 则将一些文本写入文本文件 Like Validation No 1 OK Validat
  • 生成聚合结构

    所以这里有一个问题 我想要做的是根据一组输入值生成一个数据结构 由于这是多语言提交 因此我们将输入列表视为键 值对数组 因此 还有一系列哈希 映射 字典或任何能让您满意的术语 我将在这里将所有符号保留为 JSON 希望它具有足够的通用性来翻