Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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
Sql Mongodb中的不存在或存在查询是什么样子的?_Sql_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

Sql Mongodb中的不存在或存在查询是什么样子的?

Sql Mongodb中的不存在或存在查询是什么样子的?,sql,mongodb,mongodb-query,aggregation-framework,Sql,Mongodb,Mongodb Query,Aggregation Framework,我是MongoDb的新手,正在尝试在MongoDb中执行exists()查询 我正在玩的收藏有用户(详细信息如公司和billingGroup)和预期公司 通常在Oracle中,用户和预期公司将位于两个表中,我会这样查询: SELECT * FROM tableUsers WHERE exists ( SELECT 1 FROM tableExpectedCompanies WHERE tableExpe

我是MongoDb的新手,正在尝试在MongoDb中执行exists()查询

我正在玩的收藏有用户(详细信息如公司和billingGroup)和预期公司

通常在Oracle中,用户和预期公司将位于两个表中,我会这样查询:

SELECT *
    FROM tableUsers
    WHERE exists (
        SELECT 1 
        FROM tableExpectedCompanies 
        WHERE 
            tableExpectedCompanies.companyname != tableUsers.companyName and 
            tableExpectedCompanies.billingGroup =  tableUsers.companyName.billingGroup
        )
db.MasterData.find(
    {'users.company': 
        {$nin: db.MasterData.find(
                {},
                {'expectedCompanies:1'})
        }
    })
在MongoDb中,它现在是一个集合,大致如下:

    {
          "_id" : "billingGroupX", 
          "expectedCompanies" : ["CompanyA", "company B", "supercompany X"],
          "users" : [{"name":..., "company": ...}, {}, {}]
}
我希望我能做这样的事情:

SELECT *
    FROM tableUsers
    WHERE exists (
        SELECT 1 
        FROM tableExpectedCompanies 
        WHERE 
            tableExpectedCompanies.companyname != tableUsers.companyName and 
            tableExpectedCompanies.billingGroup =  tableUsers.companyName.billingGroup
        )
db.MasterData.find(
    {'users.company': 
        {$nin: db.MasterData.find(
                {},
                {'expectedCompanies:1'})
        }
    })
但当然失败得很惨,第一个错误是:

error: { "$err" : "$nin needs an array", "code" : 13277 }
MongoDb中实际存在或不存在类似物吗?

或者类似于处于或不处于状况的情况


编辑:在我的问题得到最初的负面反馈之后。请注意,我正在努力寻找一个exists/not exists/in/not in条件,您可以像在SQL中通常那样使用子查询。

好的,下面是您需要理解的语句

MongoDB不进行连接

即使在此子查询表单中,也不能在语句中包含来自另一个集合的另一个查询。尽管如此,请注意以下几点:

错误:{“$err”:“$nin需要一个数组”,“代码”:13277}

因此,您没有按要求提供数组,但您试图输入一条语句。然后你可以考虑代码:

var results = db.MasterData.find({}, {"expectedCompanies:1"}).toArray();
查看它本身,您将看到它将从all结果返回“ExpectedCompanys”字段。我在末尾添加了
.toArray()
函数,以表明您可能一直试图做的事情不起作用,因为您将得到一个光标而不是数组。但这在这里不起作用,因为即使从这条语句中,数组也指的是整个集合,而不仅仅是一个文档

因此,您可能正在“尝试”的是将“users.company”值与“expectedcompanys”值进行匹配(或者特别是不匹配)。所以在MongoDB中,您可以这样做:

SELECT *
    FROM tableUsers
    WHERE exists (
        SELECT 1 
        FROM tableExpectedCompanies 
        WHERE 
            tableExpectedCompanies.companyname != tableUsers.companyName and 
            tableExpectedCompanies.billingGroup =  tableUsers.companyName.billingGroup
        )
db.MasterData.find(
    {'users.company': 
        {$nin: db.MasterData.find(
                {},
                {'expectedCompanies:1'})
        }
    })
db.MasterData.aggregate([
//展开“用户”数组
{“$unwind”:“$users”},
//展开“ExpectedCompanys”数组
{“$unwind”:“$ExpectedCompanys”},
//投射匹配条件
{“$project”:{
“用户”:1,
“匹配”:{“$eq”:[
“$users.company”,
“$ExpectedCompanys”
]}         
}},
//过滤结果
{“$match”:{“matching”:false},
//将展开中的重复条目分组
{“$组”:{
“_id”:{
“\u id”:“$\u id”,
“用户”:{
“名称”:“$users.name”,
“公司”:“$users.company”
}
}
}},
//投射出一份更好的文件
{“$project”:{
“\u id”:“$\u id.\u id”,
“用户”:“$\u id.users”
}}
])
这将使用,以便对数组中的元素进行排序并相互比较。每个阵列需要在不同的阶段中“未缠绕”。实际比较在第一阶段完成,使用逻辑运算符比较两个值。如果它们相等,则结果为
true
,如果不相等,则结果为
false

然后,我们使用$match阶段将结果“过滤”到所需的
false
值。这就像一个普通的
.find()
查询。然后通过发送结果,将“用户”文档中的密钥汇集在一起。这是因为当数组“未缠绕”时,其他“ExpectedCompanys”数组中的每个元素的每个条目都被“复制”。把这种形式想象成数据的“去规范化”。分组将删除此处的重复项

最后,由于所有内容都“分组”在一个键下,因此再次使用该键将结果重新塑造为更像您想要的内容


因此,该用法与“子查询”表单有一定的不同,但这就是语句比较文档中两个数组中的值的方式。

下面是Exist()或in()SQL函数转换的不同方法。 这是一个简单的javascript,非常有用,但是为了提高性能,您需要适当的索引

var mycursor = db.tableUsers.find( {} ) 

mycursor.forEach( function (x){ 
    var o = db.tableExpectedCompanies.count( { billingGroup : x.billingGroup, companyname  : {$ne: x.companyName}   } )
    if ( o > 0) {
        //print('The _id exists! ' + x._id); //debugging only
        printjson(x) ; 
        }
} )

你看过医生了吗@Lix文档将我指向$in操作符(),但示例并不针对subdocument@Lix在我看来,这不像是重复的,另一个SO链接是一个示例,用于查找字段是否存在,但我正在尝试查找字段值是否存在文档说这些运算符是相关的,但与任何字段一样,您可以使用点语法访问子文档。谈到精确匹配,但更改运算符将产生相同的行为。说
“字段值存在”
与相等运算符几乎相同-您正在与一个值进行匹配。最初的问题涉及MongoDB表,其中所有内容都在一个集合中,而不是两个单独的表中。这不会改善所选答案。