Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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上使用两个集合减少API调用的模式_Mongodb_Nested Queries - Fatal编程技术网

mongodb上使用两个集合减少API调用的模式

mongodb上使用两个集合减少API调用的模式,mongodb,nested-queries,Mongodb,Nested Queries,如果我有两个集合,一个用户集合和一个图片集合,我不太确定最佳实践是什么-我不想将所有图片嵌入到我的用户集合中 我的客户在特定条件下搜索图片。假设他从搜索中得到50张图片(即一个mongodb查询)。每个图片都与一个用户关联。我希望用户名也显示出来。我假设没有办法对返回每张图片的每个用户名称的用户集合执行单一搜索性能,即我必须执行50次搜索。这意味着,我只能通过复制图片集合中的数据(在用户名旁边)来避免额外的性能负载 同样的问题反过来说。如果我的客户搜索用户,并且说通过一个查询从搜索中返回了50个

如果我有两个集合,一个用户集合和一个图片集合,我不太确定最佳实践是什么-我不想将所有图片嵌入到我的用户集合中

  • 我的客户在特定条件下搜索图片。假设他从搜索中得到50张图片(即一个mongodb查询)。每个图片都与一个用户关联。我希望用户名也显示出来。我假设没有办法对返回每张图片的每个用户名称的用户集合执行单一搜索性能,即我必须执行50次搜索。这意味着,我只能通过复制图片集合中的数据(在用户名旁边)来避免额外的性能负载

  • 同样的问题反过来说。如果我的客户搜索用户,并且说通过一个查询从搜索中返回了50个用户。如果我希望最后关联的图片+标题也显示在用户数据旁边,我将不得不再次将其添加到用户集合中,否则我假设我需要执行50次查询才能返回图片数据


  • 假设您有一个与每个
    用户关联的
    用户
    id
    ,并且您还将该
    id
    存储在
    图片
    文档中,那么您的
    用户
    图片
    是一个松散耦合的关系

    为了不必进行50个单独的调用,您可以使用给定的,您可以提取那些
    id
    s并将它们放入列表中以运行第二个查询。您的查询基本上是英文的:“查看集合,如果它在
    id
    s列表中,请将它还给我。”


    如果您打算经常这样做,并希望它能够扩展,我建议您使用关系数据库或能够处理连接的NoSQL数据库,以避免强制您进入嵌入式文档模式

    假设您有一个
    用户
    id与每个
    用户
    关联,并且您也将该
    id
    存储在
    图片
    文档中,那么您的
    用户
    图片是一个松散耦合的关系

    为了不必进行50个单独的调用,您可以使用给定的,您可以提取那些
    id
    s并将它们放入列表中以运行第二个查询。您的查询基本上是英文的:“查看集合,如果它在
    id
    s列表中,请将它还给我。”


    如果您打算经常这样做,并希望它能够扩展,我建议您使用关系数据库或能够处理连接的NoSQL数据库,以避免强制您进入嵌入式文档模式

    假设您有一个
    用户
    id与每个
    用户
    关联,并且您也将该
    id
    存储在
    图片
    文档中,那么您的
    用户
    图片是一个松散耦合的关系

    为了不必进行50个单独的调用,您可以使用给定的,您可以提取那些
    id
    s并将它们放入列表中以运行第二个查询。您的查询基本上是英文的:“查看集合,如果它在
    id
    s列表中,请将它还给我。”


    如果您打算经常这样做,并希望它能够扩展,我建议您使用关系数据库或能够处理连接的NoSQL数据库,以避免强制您进入嵌入式文档模式

    假设您有一个
    用户
    id与每个
    用户
    关联,并且您也将该
    id
    存储在
    图片
    文档中,那么您的
    用户
    图片是一个松散耦合的关系

    为了不必进行50个单独的调用,您可以使用给定的,您可以提取那些
    id
    s并将它们放入列表中以运行第二个查询。您的查询基本上是英文的:“查看集合,如果它在
    id
    s列表中,请将它还给我。”


    如果您打算经常这样做,并希望它能够扩展,我建议您使用关系数据库或能够处理连接的NoSQL数据库,以避免强制您进入嵌入式文档模式

    假设图片集合的模式如下所示:

    图片文档

    {
        _id: Objectid(123),
        url: 'img1.jpg',
        title: 'img_one',
        userId: Objectid(342)
    }
    
    {
        _id: Objectid(123),
        url: 'img1.jpg',
        title: 'img_one',
        userId: Objectid(342),
        user_name:"user associated"
    }
    
    {
        _id: Objectid(342),
        name: "Steve jobs",
        last_assoc_img: {
               img_id: Object(342)
               url: 'img_one',
               title: 'last image title
        }
    }
    
    1)您的图片查询将返回如上所示的文档。你不必打50个电话就能让用户与图像关联。您只需使用从图片文档中获取的用户ID对
    用户集合进行1其他查询,如:

    db.users.find({_id: {$in[userid_1,user_id2,userid_3,...,userid_n]}})
    
    您将收到一组包含用户信息的用户文档。之后,您必须在客户端上处理它们的显示。您最多需要2个电话

    或者

    您可以将架构设计为:

    图片文档

    {
        _id: Objectid(123),
        url: 'img1.jpg',
        title: 'img_one',
        userId: Objectid(342)
    }
    
    {
        _id: Objectid(123),
        url: 'img1.jpg',
        title: 'img_one',
        userId: Objectid(342),
        user_name:"user associated"
    }
    
    {
        _id: Objectid(342),
        name: "Steve jobs",
        last_assoc_img: {
               img_id: Object(342)
               url: 'img_one',
               title: 'last image title
        }
    }
    
    如果你这样设计的话。您只需要1呼叫,但用户名不会与用户收集文档同步。例如,假设用户更改了他们的名称。以前保存的图片可能具有旧用户名

    2)您可以将用户收藏设计为:

    用户文档

    {
        _id: Objectid(123),
        url: 'img1.jpg',
        title: 'img_one',
        userId: Objectid(342)
    }
    
    {
        _id: Objectid(123),
        url: 'img1.jpg',
        title: 'img_one',
        userId: Objectid(342),
        user_name:"user associated"
    }
    
    {
        _id: Objectid(342),
        name: "Steve jobs",
        last_assoc_img: {
               img_id: Object(342)
               url: 'img_one',
               title: 'last image title
        }
    }
    

    您可以使用与上述相同的原则。

    假设图片集的模式如下:

    图片文档

    {
        _id: Objectid(123),
        url: 'img1.jpg',
        title: 'img_one',
        userId: Objectid(342)
    }
    
    {
        _id: Objectid(123),
        url: 'img1.jpg',
        title: 'img_one',
        userId: Objectid(342),
        user_name:"user associated"
    }
    
    {
        _id: Objectid(342),
        name: "Steve jobs",
        last_assoc_img: {
               img_id: Object(342)
               url: 'img_one',
               title: 'last image title
        }
    }
    
    1)您的图片查询将返回如上所示的文档。你不必打50个电话就能让用户与图像关联。您只需使用从图片文档中获取的用户ID对
    用户集合进行1其他查询,如:

    db.users.find({_id: {$in[userid_1,user_id2,userid_3,...,userid_n]}})
    
    您将获得a