Sql Mongodb中的不存在或存在查询是什么样子的?
我是MongoDb的新手,正在尝试在MongoDb中执行exists()查询 我正在玩的收藏有用户(详细信息如公司和billingGroup)和预期公司 通常在Oracle中,用户和预期公司将位于两个表中,我会这样查询: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
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表,其中所有内容都在一个集合中,而不是两个单独的表中。这不会改善所选答案。