Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MongoDb中创建与嵌套Sql select查询类似的嵌套查询_Mongodb_Mongodb .net Driver - Fatal编程技术网

如何在MongoDb中创建与嵌套Sql select查询类似的嵌套查询

如何在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(

我想在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({_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" } ] }