如何在MongoDb中创建与嵌套Sql select查询类似的嵌套查询
我想在MongoDb中进行一次有效的查询,以查找在用户组中列出其用户名的所有用户。理想情况下,我希望将此作为对Mongodb的单个请求。 我想要的对应于SQL中的嵌套选择。 我在mongo shell中尝试过:如何在MongoDb中创建与嵌套Sql select查询类似的嵌套查询,mongodb,mongodb-.net-driver,Mongodb,Mongodb .net Driver,我想在MongoDb中进行一次有效的查询,以查找在用户组中列出其用户名的所有用户。理想情况下,我希望将此作为对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(
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”]数组:
这可以正常工作,并返回u2和u3的用户对象
现在的问题是,如何通过查询提取$in操作符中的userid数组,以便通过单个请求完成整个查询
像这样的“嵌套查询”不起作用:
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#driver实现这一点?在MongoDB中,这些问题的答案通常是对数据进行非规范化。如果只需要组中的用户列表,则可以将用户Id和用户名存储在组文档中。在某些方面,您可以根据希望在屏幕上看到的结果来构造数据库,而不是尝试将其放入某种规范化格式 显然,只有当您的用户组列表(带有名称)可以放在单个文档中时,这才有效,但是您当前的方法在组的最大大小方面也有一些限制 另一种方法是将用户所属的组存储在每个“用户”文档的数组中。在该数组字段上添加索引,现在可以按组查找用户。考虑到一个用户所属的组可能少于一个组中的成员,这可能是最好的方法
db.user.save({_id:"u1", name:"u1 name", groups:[{_id:"g1", name:"Group One"}, ...]});
同样,您可以将组名与其_id一起存储,这样您就可以通过一次往返立即显示用户所属组的列表。当然,如果允许更改组名,则必须启动后台任务来修复名称的所有副本
我也会使用内置的MongoDB id生成器,而不是您自己的,它有许多理想的属性。定义函数
function bbb(){
var org_ids = new Array();
var orgs =
db.orgTreeNode.find({ancestors:"ca5cd344-ba47-4601-a07b-ea2c684bfb4e"},{"_id":1});
orgs.forEach(function(org){
org_ids.push(org._id);
})
return db.user.find({"org":{$in:org_ids}}).skip(300).limit(10);
}
bbb()
执行功能
function bbb(){
var org_ids = new Array();
var orgs =
db.orgTreeNode.find({ancestors:"ca5cd344-ba47-4601-a07b-ea2c684bfb4e"},{"_id":1});
orgs.forEach(function(org){
org_ids.push(org._id);
})
return db.user.find({"org":{$in:org_ids}}).skip(300).limit(10);
}
bbb()
如果它能触发你的ans-- -苏伦 SQL查询:(分组依据和不同计数) 等效的mongo查询如下所示:
db.TransactionDetails.aggregate([
{$group:{_id:{"CITY" : "$cityName"},uniqueCount: {$addToSet: "$emailId"}}},
{$project:{"CITY":1,uniqueCustomerCount:{$size:"$uniqueCount"}} }
]);
我对mongodb中的嵌套查询也有同样的疑问。在我的例子中,我加了一点并使它工作了,我想你的也会通过使用“$or”和使用toArray() 这可能不太正确,但这是一个使用nexted查询处理数据的示例。显然有点傻,在这种情况下,为什么要将ID反馈到另一个查询中,但想看看它是否能工作,并且它确实做到了:
db.notification.find({$or:db.notification.find({'startDate': { '$gte': ISODate("2019-08-01") }},{_id:1}).limit(10).toArray()})
好的,谢谢。所以在MongoDB?中不可能有“真正的嵌套查询”?。是的,我同意你关于ObjectID的评论,但我在本例中只是使用字符串来保持内容的简单。是的,没有嵌套查询,您的数据需要结构化,这样您就可以通过单个(或最小数量)获得所需的内容对数据库的请求数。op请求一个类似SQL的嵌套查询,该查询只在数据库中的一个步骤中执行。您只需获取“嵌套”查询的结果,然后将其再次发送到整个网络。
db.user.find({$or:db.usergroup.find({_id:"g1"},{_id:0,Users:1}).toArray()})
db.notification.find({$or:db.notification.find({'startDate': { '$gte': ISODate("2019-08-01") }},{_id:1}).limit(10).toArray()})
db.usergroup.aggregate([
{ $match: { _id: "g1" } },
{ $unwind: "$Users" },
{ $lookup:
{ from: "user", localField: "Users", foreignField: "_id", as: "user" }
}
])
// result :
{ "_id" : "g1", "Users" : "u2", "user" : [ { "_id" : "u2", "Name" : "u1 name" } ] }
{ "_id" : "g1", "Users" : "u3", "user" : [ { "_id" : "u3", "Name" : "u3 name" } ] }