当前位置:  开发笔记 > 数据库 > 正文

Mongodb中不存在或不存在的查询的外观如何?

如何解决《Mongodb中不存在或不存在的查询的外观如何?》经验,为你挑选了1个好方法。

我是MongoDb的新手,正在尝试查看是否可以在Mongodb中执行一个exist()查询。

我正在使用的集合有用户(包括公司和billingGroup等详细信息)和ExpectedCompanies。

通常在Oracle中,用户和ExpectedCompany将位于两个表中,我将这样查询:

SELECT *
    FROM tableUsers
    WHERE exists (
        SELECT 1 
        FROM tableExpectedCompanies 
        WHERE 
            tableExpectedCompanies.companyname != tableUsers.companyName and 
            tableExpectedCompanies.billingGroup =  tableUsers.companyName.billingGroup
        )

现在,在MongoDb中将其全部收集在一个集合中,大致如下所示:

    {
          "_id" : "billingGroupX", 
          "expectedCompanies" : ["CompanyA", "company B", "supercompany X"],
          "users" : [{"name":..., "company": ...}, {}, {}]
}

我希望我可以做这样的事情:

db.MasterData.find(
    {'users.company': 
        {$nin: db.MasterData.find(
                {},
                {'expectedCompanies:1'})
        }
    })

但是当然失败很惨,第一个错误是:

error: { "$err" : "$nin needs an array", "code" : 13277 }

MongoDb中实际上是否存在类似物?

什么样的不在状态?

编辑:对我的问题最初的负面反馈后。请注意,我正在努力寻找一个存在/不存在/不存在/不存在的情况在这种情况下您可以使用子查询,因为它通常是在SQL中完成的。



1> Neil Lunn..:

好的,这是您需要理解的声明。

MongoDB不执行联接

即使以这种子查询形式,您也不能在语句中包括来自另一个集合的另一个查询。也就是说,请注意以下几点:

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

因此,您没有提供所需的数组,但是您尝试放入一条语句。然后,您可以考虑以下代码:

var results = db.MasterData.find({}, {"expectedCompanies:1"}).toArray();

单独查看它,您将看到它将从所有结果中返回“ expectedCompanies”字段。我.toArray()在最后添加了该函数,以表明您可能一直想做的事情无法正常工作,因为您将获得一个游标而不是一个数组。但这在这里不起作用,因为即使来自此语句的数组也指向整个集合,而不仅仅是一个文档。

因此,您很可能要“尝试”执行的操作是将“ users.company”值与“ expectedCompanies”值进行匹配(或完全匹配)。因此,在MongoDB中,您可以这样做:

var results = db.MasterData.find({}, {"expectedCompanies:1"}).toArray();

为了使数组中的元素展开并比较它们,使用了聚合。每个阵列都需要在单独的阶段“展开”。实际比较是在第一个$ project阶段完成的,使用$ eq逻辑运算符比较两个值。他们等于结果的地方,而不是结果。truefalse

然后,我们使用$ match阶段将结果“过滤”为所需的false值。这就像普通.find()查询一样。然后,结果通过$ group发送,以合并“用户”文档中的密钥。这是因为在对数组进行“展开”时,会为其他“ expectedCompanies”数组中的每个元素“复制”每个条目。考虑一下$ unwind形式,就像“去规范化”数据一样。分组会删除此处的重复项。

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

因此,用法与“子查询”形式有所不同,但这是您执行语句以比较文档中两个数组中的值的方式。

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有