【问题标题】:Mongodb: What is the best way to search multiple collections for the same field in one queryMongodb:在一个查询中为同一字段搜索多个集合的最佳方法是什么
【发布时间】:2017-03-16 04:54:01
【问题描述】:

我继承了一堆集合,每个集合都有共同的字段。 有没有办法查询集合 A 和集合 B 中的“EMAIL”字段……或者我是否坚持以编程方式遍历集合?

db.colA.find({"EMAIL":"joe@doe.com"})

集合 A: {“_id”:ObjectId(“58197fc91b69ba68721d4148”),“UUID”:“0b6827f2-9384-11e0-8f4a-b8ac6f949be6”,“EMAIL”:“JOHNDOE@YAHEE.COM”,“FNAME”:“JOHN”,“LNAME” " : "DOE"}

集合 B: { “_id”:ObjectId(“4ed234423654fea654a654f2”),“SOURCE”:“65488451522”,“EMAIL”:“JOHNDOE@YAHEE.COM”,“FN”:“JOHN”,“DOB”:“1967 年 5 月 13 日"}

预期行为:搜索查询将返回两条记录。

好吧,为什么不查询 Col A 和 Col B .. 我在数据库中有 17 个集合,一个查询会很棒。

【问题讨论】:

  • 请提供来自您的集合 A 和 B 的示例文档以及预期的输出。我不确定你想达到什么目的

标签: mongodb


【解决方案1】:

没有办法做到这一点。您必须以编程方式执行此操作。虽然 MongoDB 有嵌入文档,并且一个“实体”可能散布在许多集合中,但应该有一个集合代表完整的实体

例如,您可能有一个 UserProfile 集合,但用户配置文件的 sn-ps 可能嵌入到其他集合中。在这种情况下,当您需要完整的用户个人资料时,您可以直接从 UserProfile 集合中查询。

【讨论】:

    【解决方案2】:

    您不能在单个查询中使用当前集合执行此操作。 您可以使用 DBRefs 实现此目的,但它很快就会被弃用(如果还没有的话),所以除非绝对必要,否则不要使用它。

    即使在 17 个不同的集合上运行相同的查询不是很优雅,我想这仍然是最好的选择

    【讨论】:

    • 我害怕那个。
    【解决方案3】:

    您可以使用聚合查找来实现此目的:

    db.colA.aggregate([
        {
          $lookup:
            {
              from: "colB",
              localField: "EMAIL",
              foreignField: "EMAIL",
              as: "connected_query"
            }
       }
    ])
    

    然后,您的结果中将有一个名为 connected_query 的字段,该字段引用与 colA 具有相同电子邮件的 colB 结果。

    【讨论】:

    • 如果您有超过 17 个集合,您将如何使用它?它实际上是要找到一个包含该字段(在本例中为电子邮件)的文档,该文档可以位于 17 个集合中的任何一个或多个集合中。
    【解决方案4】:

    如果您正在谈论联接,则 $lookup 已在 mongo 最新版本中启用。 Java 文档:https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

    【讨论】:

    • 这些集合是相互独立的。他们只是碰巧有共同的领域(例如电子邮件和电话)。当我需要查找其余信息时,我不确定我要查找的记录是哪个集合。所以我必须查询数据库中的每个集合。在 NOde 或 PHP 中,我可以循环进入它,我想知道 find() 或其他命令中是否有一个选项可以指定用于查询的集合。
    • 我对 mongodb 的了解可能有限,但我不认为你能达到你想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 2018-07-16
    • 2023-04-09
    • 2018-06-07
    • 2010-12-18
    • 2018-06-30
    • 1970-01-01
    相关资源
    最近更新 更多