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

时间:2017-10-03 15:59:05

标签: 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被建议作为可能的候选者。

1 个答案:

答案 0 :(得分:1)

通过查看您的问题。我知道你正在使用JSON和Clojure。

让我们看看哪些是适合JSON的NoSQL。 populor NoSQL的快速概述

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

  2. Redis:Redis将键映射到值的类型。除了List,Sets,Sorted Sets,Hash Tables,Geospatial data之类的字符串之外,它还有一些抽象的数据类型。

  3. Apache CouchDB:CouchDB管理一系列JSON文档。

  4. MongoDB:CouchDB管理一系列BSON文档。 BSON是二进制JSON http://bsonspec.org/spec.html

  5. 如果您使用大量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文档提供正则表达式功能。

      {     “selector”:{         “afieldname”:{“$ regex”:“^ A”}     } }

    4. 参考

      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
      3. 你可以使用MongoDB和CouchDB。 MongoDB可以提供大量资源。