mongodb - 哪个 nosql 选项相对于存储过程和大型数组?

标签 mongodb cassandra redis couchdb

我有一个 nosql 数据存储的用例,但我不知道该使用哪一个:

我的数据存储中的每个文档都有一个用于 _id 的键和另一个作为对象数组的键。这个数组的每个对象哈希元素都有一个 _elementid 的键和一个颜色的键。

我希望我的服务器代理向数据存储发送更新请求,其中包含用作正则表达式的子字符串,该子字符串限定 _id 与正则表达式匹配的所有文档。然后,我想将一个元素推送到此输出的每个文档的数组中。对于每个 unshift,这个新元素将具有相同的颜色,但 _elementid 对于每个元素都是唯一的。

有没有提供这种存储过程的 nosql 选项?对数组的长度有限制吗?

*** 编辑 ***

(1) 文件 A:

{
    _id : "this_is-an-example_10982029822",
    dataList : [
        {
            _elementid : "999999283902830",
            color : "blue",
            
        }, {
            _elementid : "99999273682763",
            color : "red"
        }
    ]
}

DOCUMENT B: 

{
    _id : "this_is-an-example_209382093820",
    dataList : [
        {
            _elementid : "99999182681762",
            color : "yellow"
        }
    ]
}

(2) 更新请求示例

(let [regex_ready_array   ["this_is-an-example" "fetcher" "finder"]
      fetch_query_regex   (str "^" (clojure.string/join "|^" regex_ready_array))
      element_template    {
                                :_elementid { (rand-int 1000000000000000) }
                                :color      "green"
                          }
      updated_sister_objs (mc/bulk-update connection "arrayStore" {:_id {$regex fetch_query_regex }} "unshift" element_template)])
                    

(3) 文件 A:

{
    _id : "this_is-an-example_10982029822",
    dataList : [
        {
            _elementid : "999999146514612",
            color : "green",
            
        }, {
            _elementid : "999999283902830",
            color : "blue",
            
        }, {
            _elementid : "99999273682763",
            color : "red"
        }
    ]
}

DOCUMENT B: 

{
    _id : "this_is-an-example_209382093820",
    dataList : [
        {
            _elementid : "9999997298729873",
            color : "green",
            
        }, {
            _elementid : "9999918262881762",
            color : "yellow"
        }
    ]
}

*** 编辑 2 ***

(1) dataList 数组可能很大(大到 MongoDB 的 16mb 文档大小限制会出现问题);

(2) 分配给附加 dataList 元素的 _elementid 值对于每个新元素都会有所不同,并且商店会自动将这些值分配为随机数值

(3) 一个更新请求应该应用所有更新,而不是每个附加元素一个更新;

(4) OP 正在寻找几种“nosql 解决方案”之间的比较和对比,建议将 MongoDB、Cassandra、Redis 和 CouchDB 作为可能的候选者。

最佳答案

通过看到您的问题。我了解您正在使用 JSON 和 Clojure。

让我们看看哪些 NoSQL 适合 JSON。流行的 NoSQL 快速概览

  1. Apache Cassandra:Cassandra 中的数据模型本质上是键值对和面向列(或表格)数据库管理系统的混合体。它的数据模型是具有一致性的分区行存储。

  2. Redis:Redis 将键映射到值的类型。它有一些除字符串之外的抽象数据类型,如 List、Sets、Sorted Sets、Hash Tables、地理空间数据。

  3. Apache CouchDB :CouchDB 管理 JSON 文档的集合。

  4. MongoDB:CouchDB 管理 BSON 文档的集合。 BSON 是二进制 JSON http://bsonspec.org/spec.html .

如果您使用大量 JSON 负载,您可以使用 MongoDB 或 Apache CouchDB。但是您想根据 REGEX 更新 JSON。

让我们检查一下 CouchDB 和 MongoDB 的 REGEX 功能

  • 在 CouchDB 和 MongoDB 中都可以使用 MAP Reduce 轻松完成

    正则表达式选择:db.student.find( { f_name: { $regex: 'this_is-an-example.*'} } ).pretty();

  • MongoDB:在 mongodb 中,我们有正则表达式操作。我已经尝试过了,它工作正常。

引用

  1. https://docs.mongodb.com/manual/reference/operator/query/regex/

  2. mongoDB update statement using regex

  3. https://www.w3resource.com/mongodb/mongodb-regex-operators.php

    • CouchDB:我还没有尝试过使用 Regex 的 CouchDB,但据我所知,这是可能的。正则表达式函数可根据 CouchDB 文档获得。

    { “选择器”:{ "afieldname": {"$regex": "^A"} } }

引用

  1. http://docs.couchdb.org/en/2.0.0/api/database/find.html
  2. Temporary couchdb view of documents with doc_id matching regular expression

您可以使用 MongoDB 和 CouchDB 中的任何一个。 MongoDB 有很多可用的资源。

关于mongodb - 哪个 nosql 选项相对于存储过程和大型数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46548814/

相关文章:

docker - 大容量安装防止在容器中启动

cassandra - "PER PARTITION LIMIT"在cassandra的cql查询中是什么意思?

Cassandra 节点工具退役

redis - 从redis中的通配符键获取/求和值

Python redis-log错误

mongodb - Mongod 错误 : 98 Unable to lock file:/data/db/mongod. 锁定资源暂时不可用。 mongod 实例是否已经在运行?

c# - 如何通过 .NET 在 MongoDB 中创建索引

java - (Spring Data MongoDB)多对多关系场景

mongodb - 如果我可以使用 AWS 安全组来保护我的 MongoDB EC2 实例,我真的需要 VPC 吗?

redis - 使用 redis 的可恢复 PUB/SUB