gpt4 book ai didi

mongodb - 如何在 MongoDb 中进行类似于嵌套 Sql 选择查询的嵌套查询

转载 作者:IT老高 更新时间:2023-10-28 13:09:23 26 4
gpt4 key购买 nike

我想在 MongoDb 中进行高效查询,以查找在用户组中列出其用户 ID 的所有用户。理想情况下,我想将此作为对 Mongodb 的单个请求。我想要的对应于 SQL 中的嵌套选择。我在 mongo shell 中试过这个:

db.user.save({_id:"u1", Name:"u1 name"});
db.user.save({_id:"u2", Name:"u1 name"});
db.user.save({_id:"u3", Name:"u3 name"});
db.usergroup.save({_id:"g1", Users: ["u2","u3"]});

现在这是我想要做的选择,但没有硬编码 ["u2","u3"] 数组:

db.user.find({_id:{$in:["u2","u3"]}}).forEach(printjson);

这可以正常工作并返回 u2 和 u3 的用户对象。

现在的问题是如何通过查询提取 $in 运算符中的用户 ID 数组,以便可以通过单个请求进行整个查询。

这样的“嵌套查询”不起作用:

db.user.find({_id:{$in:db.usergroup.find({_id:"g1"},{_id:0,Users:1})}}).forEach(printjson);

给出这个错误: 3 月 27 日星期二 06:17:41 未捕获的异常:错误:{“$err”:“无效查询”,“代码”:12580 } 加载失败:mongoNestedSelect.js

1) 这在 mongodb 中是否可行?

2)如何使用官方c#驱动来做到这一点?

最佳答案

在 MongoDB 中,此类问题的答案通常是非规范化您的数据。如果您只需要组中的用户列表,您可以将用户 ID 用户名存储在组文档中。在某些方面,您可以根据希望在屏幕上看到的结果来构建数据库,而不是尝试将其置于某种规范化格式中。

显然,只有当您的用户组列表(带有名称)可以放在单个文档中时,这才有效,但您当前的方法在组的最大大小方面也有一些限制。

另一种方法是将用户所属的组存储在每个“用户”文档的数组中。在该数组字段上添加索引,现在您可以按组查找用户。鉴于用户所属的组可能少于组中的成员,这可能是这里的最佳方法。

db.user.save({_id:"u1", name:"u1 name", groups:[{_id:"g1", name:"Group One"}, ...]});

同样,您可以使用 _id 存储组名,这样您就可以通过单次往返立即显示用户所属的组列表。当然,如果您允许更改组名,则必须启动后台任务来修复所有这些名称的副本。

我也会使用内置的 MongoDB id 生成器而不是您自己的,它有许多理想的属性。

关于mongodb - 如何在 MongoDb 中进行类似于嵌套 Sql 选择查询的嵌套查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9883617/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com