使用 RavenDB 的“传统”一对多查询

2024-03-26

我知道include-RavenDB 的功能。它允许我在数据库的一次往返中立即获取引用的文档。但我的问题是:我首先获取的文档不包含对“其他”文档的引用。但“其他”文档引用了当前文档。

想象一下我们在世界各地都有站点的设置。每个site可能会触发各种警报。每个alarm有一个参考site via siteId.

现在我想获取所有站点的列表,包括所有警报。但看起来,RavenDB 不可能做到这一点?自从include只接受“路径”site- 保存引用文档的 id(或 id 数组)的文档。

这可以通过提供一系列来解决alarmIdssite'-document and referencing this array in include. But in contrast to a lot of examples featuring stuff like an orderwith订单项where the order is a self contained thing, mysite` 将运行数年,收集 0 到 100 万个警报。这对我来说似乎是个坏主意。

当然我可以反过来:查询所有警报并include网站通过sitesId。但这不会返回零警报的站点。

那么这只是我这边的设计错误吗?我误解了什么吗?或者是否无法在一个查询中执行此操作并阻止“n+1 查询”?


public class A
{
    public string Id { get; set; }
}

public class B
{
    public string Id { get; set; }
    public string A { get; set; }
}

public class MultiMapIndex : AbstractMultiMapIndexCreationTask<MultiMapIndex.Result>
{
    public class Result
    {
        public string Id { get; set; }
        public IEnumerable<string> Bs { get; set; }
    }

    public MultiMapIndex()
    {
        AddMap<A>(items => from a in items
            select new Result {Id = a.Id, Bs = new string[0]});

        AddMap<B>(items => from b in items
            select new Result {Id = b.A, Bs = new[] {b.Id}});

        Reduce = results => from result in results
            group result by result.Id
            into g
            select new Result {Id = g.Key, Bs = g.SelectMany(r => r.Bs)};
    }
}

[Fact]
public async Task TestCase()
{
    using var store = GetDocumentStore();

    await new MultiMapIndex().ExecuteAsync(store);
    using (var session = store.OpenAsyncSession())
    {
        await session.StoreAsync(new B {A = "a/1"}, "b/0");
        await session.StoreAsync(new A(), "a/1");
        await session.StoreAsync(new A(), "a/2");
        await session.SaveChangesAsync();
    }

    WaitForIndexing(store);

    using (var session = store.OpenAsyncSession())
    {
        var results = await session.Query<MultiMapIndex.Result, MultiMapIndex>()
            .Include(r => r.Bs)
            .ToArrayAsync();

        var before = session.Advanced.NumberOfRequests;

        var bs = session.LoadAsync<B>(results[0].Bs);

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

使用 RavenDB 的“传统”一对多查询 的相关文章

  • 如何从脚本中退出 NodeJS 脚本?

    现在我有一个为我设置数据库的nodeJS 脚本 每当我在命令行中运行它时 我都需要按 ctrl C 退出脚本 我假设nodeJS中有某种命令可以让它在完成后自行退出 但我似乎无法通过在interwebz上进行搜索来找到任何此类命令 有人知道
  • 使用 array.map 后如何运行函数?

    我想做的是在使用 array map 之后运行一个函数 理论上 我应该能够在 array map 之后运行 但是 由于某种原因 它在 array map 完成之前运行该函数 我该如何解决 这是我的代码 var channelIds chan
  • WebSocket 连接失败:WebSocket 握手期间出错:意外的响应代码:400

    我正在尝试将 Socket io 与 Angular 集成 但在从客户端到服务器建立连接时遇到困难 我查看了其他相关问题 但我的问题发生在本地 所以中间没有网络服务器 这就是我的服务器代码的样子 const app express cons
  • Socket.IO 消息不更新 Angular 变量

    我有一个 socket io 客户端 服务器设置 并在客户端上运行 AngularJS Server js var io require socket io server io on connection function socket s
  • 在不知道对象键的情况下进行 Cosmos DB 查询

    单个文档示例 id xxxxxx properties a prop type names value John b prop type score value 5 5 c prop type names value Steve 问题 如何
  • 在node.js中使用socket.io设置服务器-服务器SSL通信

    我正在尝试使用 socket io 通过 ssl 连接来设置服务器到服务器的链接 这是我的例子 Server var app require express var config require config var https requi
  • 如何在 Express 中模拟中间件以跳过单元测试的身份验证?

    我在 Express 中有以下内容 index js var service require subscription service var auth require auth auth service var router expres
  • 快递+护照+会话。为每个页面加载执行查询

    我正在使用 Express 4 2 0 和 Passport 0 2 0 我使用的express session中间件是1 2 1 我对节点身份验证比较陌生 所以请耐心等待 我注意到 对于每个页面加载 护照正在执行数据库请求 Executi
  • 刷新后,socket.io 客户端多次侦听同一事件

    我得到了一个包含项目表的母版页 成功后表数据将不断刷新socket io与服务器的连接 单击表中的某个项目 该项目的 id 将传递到服务器 时 将使用 ajax 加载子视图 并通过侦听来自服务器的事件不断刷新该子视图 现在的问题是 通过选择
  • Mongoose 使用 GeoJSON 点作为查询参数调用 geoNear 不起作用

    给定一个为包含 GeoJSON 位置的文档定义的模式 var BranchSchema new Schema location type type String required true enum Point LineString Pol
  • Nodemon - 使用配置文件指定扩展监视列表

    有没有办法使用配置文件而不是命令行来指定监视列表 Nodemon 文档中的命令行方法 我尝试使用nodemon json配置文件包含以下内容 ext js json hbs html 返回 扩展名匹配 错误 然后我尝试将配置添加到packa
  • 规则和夏令时

    我在用着rrule https github com jakubroztocil rrule在我的数据库中创建和存储事件 一切正常 直到我发现我的重复事件与 3 月 31 日之后有一个小时的差异 在法国 这一天我们进行夏令时更改 实际上 我
  • 将 AngularJS 应用程序部署到普通 Apache HTTP 服务器是一种常见的选择吗?

    我很好奇 AngularJS 应用程序通常部署到什么样的服务器上 Google 没有给出令人满意的答案 特别是 在我看来 AngularJS 应用程序只是静态文件的集合 因此在生产中将这样的应用程序部署到普通 Apache HTTP 服务器
  • ElectronJS 捕获屏幕质量低

    我正在使用 ElectronJS 测试屏幕捕获 我可以捕获屏幕 但捕获的视频质量低于原始视频 操作系统 Linux Mint 20 电子版本 11 1 0 这是我的代码 我选择我的屏幕 然后使用以下命令在电子应用程序中显示捕获的屏幕vide
  • 如何:SQL 还是 NOSQL?

    我还没有遇到过这个问题 但这就是我的想法 非常肤浅和简单化恕我直言 如果您有键值类型的存储 并且所有访问都是键查找 请使用 NOSQL 解决方案 如果您想要基于值 和子值 进行查找或者有一些更复杂的东西 例如联接 您会选择关系解决方案 事务
  • 使用node.js/Express从HTTP重定向到HTTPS

    有什么方法可以更改我的 Web 应用程序以侦听 HTTPS 而不是 HTTP 我正在使用node js express 我需要它来侦听 HTTPS 因为我正在使用地理定位 而 Chrome 不再支持地理定位 除非从 HTTPS 等安全上下文
  • 有没有办法让 npm install (命令)在代理后面工作?

    阅读有关代理变量的信息 npmrc文件 但它不起作用 尽量避免手动下载所有需要的包并安装 我这样解决了这个问题 我运行这个命令 npm config set strict ssl false 然后将 npm 设置为使用 http 而不是 h
  • socket.io 服务器的 Node.js 客户端

    我有一个正在运行的 socket io 服务器和一个带有 socket io js 客户端的匹配网页 一切正常 但是 我想知道是否可以在另一台机器上运行一个单独的 node js 应用程序 该应用程序将充当客户端并连接到提到的 socket
  • 使用 NodeJS 从 GCP 存储下载对象

    我在用着 google cloud 存储 https www npmjs com package google cloud storage从节点应用程序访问 Google Cloud Storage 存储桶内的对象 但我无法使其工作 我已在
  • 为什么 Node.js 命名为 Node.js? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我只是好奇为什么 Node js 这么命名 我搜索了他们的网站和常见问题解答 但没有任何内容可以帮助我理解为什么它被命名为 Node js 官方名称其

随机推荐

  • 在 python 中实现 Bron–Kerbosch 算法

    对于一个大学项目 我正在尝试实施布隆 克博什算法 http en wikipedia org wiki Bron Kerbosch algorithm 即列出给定图中的所有最大团 我正在尝试实现第一个算法 不进行旋转 但是我的代码在测试后并
  • 如何更改 Netbeans 缓存目录?

    有什么方法可以更改 Netbeans 7 0 1 缓存目录吗 我只是不想更改几个应用程序的缓存 临时目录 其中之一是 NetBeans 对于 Netbeans 7 来说这似乎是不可能的 除非您重新定位整个用户目录或按照 MadWizard
  • 检查 AngularJs 指令中属性是否存在

    可以检查给定属性是否存在于指令中 理想情况下使用隔离范围 或者在最坏的情况下使用属性对象 指令看起来像这样
  • 信号执行期间的 sigprocmask

    我目前正在研究使用sigprocmask阻止某些信号 在这种情况下 SIGALRM and SIGCHLD 当关键代码段正在执行时 与这些信号关联的两个信号处理程序都将访问和修改中央数据结构 因此在主进程处理该数据结构时阻止它们访问它至关重
  • 将 youtube api 帮助程序集成到 iOS 时出现错误 258

    https developers google com youtube v3 guides ios youtube helper https developers google com youtube v3 guides ios youtu
  • 编写 SQL Server 权限脚本

    我想将我对存储过程和其他内容设置的所有权限从开发数据库复制到生产数据库 通过 SSMS GUI 工具手动完成这一切非常麻烦 更不用说容易出错 因此 我正在寻找一种方法 可以直接转储在一个数据库中设置的权限 并将这些相同的权限应用于单独的数据
  • 编辑所有视图和存储过程,查找和替换?

    有没有一种简单的方法可以在我的 SQL Server 数据库中的每个视图和存储过程中查找和替换字符串 我需要将 X United Kingdom 替换为 X UK 您需要查看sysobjects和syscomments 视图和存储过程的文本
  • 如何在 Google Visualization API 中进行多行注释?

    我正在尝试使用谷歌可视化 API 生成带注释的 LineChart 当我让它工作时 我希望能够在可能的情况下使注释具有换行符 不幸的是 Google 的 API 似乎忽略了任何换行信息并将所有内容显示在一行上 有人想出解决这个问题的办法吗
  • R htmlParse XML 中的编码问题

    我尝试抓取网站但无法处理此编码问题 putting together the url search str lt allintitle amphibian richness OR diversity url lt paste http sc
  • 如何在类库中定位EF生成的元文件?

    我已将 Entity Framework 4 模型移至类库 元文件构建到 bin Debug 我用来在类库中定位元文件的连接字符串是什么 我努力了
  • 将多个谓词函数组合为一个

    是否可以编写例如 defn multiple of three n zero mod n 3 defn multiple of five n zero mod n 5 into multiple of three or five 所以我可以
  • Grails 3 Spring Security 预身份验证

    我的应用程序使用 Grails 3 我正在尝试进行预身份验证 如此处所述article https docs spring io spring security site docs 3 0 x reference preauth html
  • 如何检查 Ruby 对象的方法?

    我想知道是否有一个 Ruby 方法调用仅显示由其调用的 Ruby 对象定义的方法 而不是由其祖先类定义的所有方法 这就是methods似乎是这样 methods采用可选的布尔参数 该参数指定是否还列出对象的类及其超类的方法或仅列出对象的单例
  • SQL“之间”不包含在内

    我有一个这样的查询 SELECT FROM Cases WHERE created at BETWEEN 2013 05 01 AND 2013 05 01 但即使 1 日有数据 也没有给出任何结果 created at好像2013 05
  • 使用 SSH 从 BitBucket pip 安装自定义包,无需输入 SSH 密码

    我正在尝试使用pip install git ssh email protected cdn cgi l email protection my org my package repo git从 BitBucket 安装定制的 python
  • PHP MySQL插入多维关联数组从数组键构建查询[重复]

    这个问题在这里已经有答案了 我已经尝试了这两个链接 但我没有得到 fields 和 newdata 中的预期变量内容 这个问题在这里提出了一个新问题 PHP如何从关联数组中提取键名称和值以进行mysql查询 https stackoverf
  • 无法理解递归

    好的 所以我有一个程序 public class Rec public static void main String args test 5 static void test int n if n gt 0 System out prin
  • 如何将 docker-compose 升级到最新版本

    我已经使用命令安装了 docker compose sudo apt install docker compose 它安装了 docker compose 版本 1 8 0 并构建未知 我需要最新版本的 docker compose 或至少
  • 语法错误:JSON.parse:JSON 第 1 行第 2 列出现意外字符

    我需要将此 div 附加到另一个 div 但它给了我这个错误 语法错误 JSON parse 第 1 行第 2 列出现意外字符 JSON 数据 这是我的 JavaScript 代码 var str message message text
  • 使用 RavenDB 的“传统”一对多查询

    我知道include RavenDB 的功能 它允许我在数据库的一次往返中立即获取引用的文档 但我的问题是 我首先获取的文档不包含对 其他 文档的引用 但 其他 文档引用了当前文档 想象一下我们在世界各地都有站点的设置 每个site可能会触