Node.js Firestore中对象嵌套数组的数据模型

Node.js Firestore中对象嵌套数组的数据模型,node.js,firebase,google-cloud-firestore,nosql,data-modeling,Node.js,Firebase,Google Cloud Firestore,Nosql,Data Modeling,我需要经验丰富的NoSQL工程师就如何构造数据提供建议 我想将我的SQL数据结构建模为NoSQL for Google Cloud Firestore 我以前没有使用NoSQL数据库的经验,但我精通传统SQL 我使用Node.js编写查询 到目前为止,我使用示例数据将三个表转换为JSON文档: { "session": { "userId": 99992222, "token": "jwttoken1191891j1kj1khjjk1hjk1kj1",

我需要经验丰富的NoSQL工程师就如何构造数据提供建议

  • 我想将我的SQL数据结构建模为NoSQL for Google Cloud Firestore
  • 我以前没有使用NoSQL数据库的经验,但我精通传统SQL
  • 我使用Node.js编写查询
到目前为止,我使用示例数据将三个表转换为JSON文档:

{
  "session": {
      "userId": 99992222,
      "token": "jwttoken1191891j1kj1khjjk1hjk1kj1",
      "created": "timestamp"
  }
}
我的问题是:

  • session.userId、user.id、visitor.id都可以表示同一个用户。Firestore与SQL中的外键等价于什么?如何在查询中连接/加入这三个集合
  • 如何处理嵌套对象
    basketDetail
    ?它在哪里很好,还是我应该定义它自己的集合? 我预料会有疑问

    • 偶尔添加所有最近的用法
    • 经常检查用户是否拥有特定的产品id
    • 经常用新数据替换整个
      baskedDetail
      对象
    • 偶尔更新一个特定的产品标识
  • 如果将集合
    user
    basketDetail
    分开,我将如何在查询中将其连接起来

  • 谢谢你的建议

  • session.userId、user.id、visitor.id都可以表示同一个用户。Firestore与SQL中的外键等价于什么?如何在查询中连接/加入这三个集合
  • 不幸的是,Firestore中没有
    JOIN
    子句。Firestore中的查询很浅,只能从运行查询所针对的集合中获取元素。除非使用,否则无法在一个查询中从两个集合获取文档,但事实并非如此,因为项目中的集合具有不同的名称

    如果有三个集合,则需要三个单独的查询。你不可能一蹴而就

  • 如何处理嵌套对象basketDetail?它在哪里很好,还是我应该定义它自己的集合
  • 在文档中可以输入的数据量方面有一些限制。根据官方文件,关于:

    文档的最大大小:1 MiB(1048576字节)

    如您所见,单个文档中的数据总量限制为1 MiB。因此,如果您认为嵌套对象
    basketDetail
    可以保持在此限制范围内,则可以使用该模式,否则,将其添加到子集合。除此之外,所有这些操作都允许在Firestore中进行。如果您在实现它们时遇到困难,请发布另一个问题,以便我们可以查看

    如果将用户集合与查询中的basketDetail分开,我将如何将其连接

    不能连接/加入两个集合。如果在子集合中分隔
    basketDetail
    ,则需要两个查询

  • session.userId、user.id、visitor.id都可以表示同一个用户。Firestore与SQL中的外键等价于什么?如何在查询中连接/加入这三个集合
  • 不幸的是,Firestore中没有
    JOIN
    子句。Firestore中的查询很浅,只能从运行查询所针对的集合中获取元素。除非使用,否则无法在一个查询中从两个集合获取文档,但事实并非如此,因为项目中的集合具有不同的名称

    如果有三个集合,则需要三个单独的查询。你不可能一蹴而就

  • 如何处理嵌套对象basketDetail?它在哪里很好,还是我应该定义它自己的集合
  • 在文档中可以输入的数据量方面有一些限制。根据官方文件,关于:

    文档的最大大小:1 MiB(1048576字节)

    如您所见,单个文档中的数据总量限制为1 MiB。因此,如果您认为嵌套对象
    basketDetail
    可以保持在此限制范围内,则可以使用该模式,否则,将其添加到子集合。除此之外,所有这些操作都允许在Firestore中进行。如果您在实现它们时遇到困难,请发布另一个问题,以便我们可以查看

    如果将用户集合与查询中的basketDetail分开,我将如何将其连接

    不能连接/加入两个集合。如果在子集合中分隔
    basketDetail
    ,则需要两个查询

    {
      "user": {
        "id": 99992222,
        "username": "userName",
        "avatarUrl": "https://url-xxxx.com",
        "lastLogin": "2019-11-23 13:59:48.884549",
        "created": "2019-11-23 13:59:48.884549",
        "modified": "2019-11-23 13:59:48.884549",
        "visits": 1,
        "profile": true,
        "basketDetail": { // I get this data from a third party API
          "response": { 
            "product_count": 2,
            "products": [
              {
                "product_id": 111,
                "usageInMinutes_recent": 0,
                "usageInMinutes": 0,
                "usageInMinutes_windows": 0,
                "usageInMinutes_mac": 0,
                "usageInMinutes_linux": 0
              },
              {
                "product_id": 222,  // no recent usage here
                "usageInMinutes": 0,
                "usageInMinutes_windows": 0,
                "usageInMinutes_mac": 0,
                "usageInMinutes_linux": 0
              }
            ]
          }
        }
      }
    }
    
    {
      "visitor": {
        "id": 999922221,
        "created": "2019-11-23 13:59:48.884549"
      }
    }