Ibm cloud 在不同的时间在cloudant db中的单个_id下插入多个键值对数据?

Ibm cloud 在不同的时间在cloudant db中的单个_id下插入多个键值对数据?,ibm-cloud,mqtt,iot,cloudant,node-red,Ibm Cloud,Mqtt,Iot,Cloudant,Node Red,我的要求是在cloudant中的single_id下,在不同的时间从mqtt订阅者处获取json对,但我在尝试将新的json对插入现有的_id时遇到了错误,它只是替换了旧的json对。我需要在一个id下至少10个json对。在不同的时间注入 首先,您应该确定要多次更新特定文档的体系结构决策。一般来说,这是不鼓励的,尽管这取决于您的应用程序。相反,您可以考虑将每个新的信息插入为单独的文档,然后使用Map Reduce视图来反映应用程序的状态。p> 例如(我假设您有多个“设备”,每个设备都具有某种唯

我的要求是在cloudant中的single_id下,在不同的时间从mqtt订阅者处获取json对,但我在尝试将新的json对插入现有的_id时遇到了错误,它只是替换了旧的json对。我需要在一个id下至少10个json对。在不同的时间注入

首先,您应该确定要多次更新特定文档的体系结构决策。一般来说,这是不鼓励的,尽管这取决于您的应用程序。相反,您可以考虑将每个新的信息插入为单独的文档,然后使用Map Reduce视图来反映应用程序的状态。p> 例如(我假设您有多个“设备”,每个设备都具有某种唯一标识符,需要向cloudant DB添加数据)

然后需要一个映射函数,如

\u设计/设备/\u视图/状态

{
  function (doc) {
    emit(doc.device_id, 1);
}
然后,您可以
获取该视图的结果,以查看与特定设备关联的所有“info_X”数据

获取account.cloudant.com/databasename//\u design/device//\u view/state

{"total_rows":3,"offset":0,"rows":[
{"id":"28324b34907981ba972937f53113ac3f","key":123,"value":1},
{"id":"d50553d206d722b960fb176f11841974","key":123,"value":1},
{"id":"eaa710a5fa1ff4ba6156c997ddf6099b","key":1234,"value":1}
]}
然后您可以使用查询参数来控制输出,例如

GET account.cloudant.com/databasename/\u design/device/\u view/state?key=123&include\u docs=true

{"total_rows":3,"offset":0,"rows":[
{"id":"28324b34907981ba972937f53113ac3f","key":123,"value":1,"doc":
  {"_id":"28324b34907981ba972937f53113ac3f",
     "_rev":"1-bac5dd92a502cb984ea4db65eb41feec",
     "info_b":"data b",
     "device_id":123}
  },
{"id":"d50553d206d722b960fb176f11841974","key":123,"value":1,"doc":
  {"_id":"d50553d206d722b960fb176f11841974",
     "_rev":"1-a2a6fea8704dfc0a0d26c3a7500ccc10",
     "info_a":"data a",
     "device_id":123}}
]}
现在您有了
设备的完整状态\u id:123

时机 另一个问题是更新文档的速度

底线建议是,如果您仅每分钟更新文档一次或更新频率较低,那么您的应用程序更新单个文档可能是合理的。也就是说,您将使用相同的
\u id
值向同一文档添加新的键值对。但是,为了做到这一点,您需要获取完整的文档,添加新的键值对,然后将该文档放回数据库。您必须确保您提供的是该文档的最新版本,并且您还应该检查文档由多个设备更新时可能发生的冲突


如果您以高速率获取特定设备的新数据,可能会经常遇到冲突,因为cloudant是一个分布式文档存储。在这种情况下,您应该遵循我上面给出的示例

第二种方法的示例流程由@gadamcox概述,用于不需要频繁更新文档的用例:

[…]您将使用相同的
\u id
值向同一文档添加新的键值对。但是,为了做到这一点,您需要获取完整的文档,添加新的键值对,然后将该文档放回数据库

应用程序首先按id()获取现有文档

然后应用程序更新内存中的文档

{
 "_id": "100",
 "_rev": "1-2902191555...",
 "No": ["1","2"]
}
并通过指定
\u id
\u rev
()


您应该显示要插入的文档的结构。这将更容易回答。很可能只是从Cloudant加载现有文档(该文档将有一个由Cloudant维护的_rev属性来处理保存冲突)、更新此文档并再次插入它的问题。虽然我是Cloudant的新手,但仍在努力。如果我们更新数据,意味着只修改现有数据。如何将新记录插入到已保存一条记录的现有_id中?我知道在一个_-id下可以有更多的记录,但是是否可以通过添加更多的记录来更新相同的_-id?如果不清楚,我可以简单地解释一下我的有效负载是否为{u-id:“100”,“否”:“1”}在cloudant中,它将创建一个_-id 100并存储编号:1,但是如果我尝试插入{u-id:“100”,“否”:“2}在相同的id下,它只需覆盖现有的No:1。我需要同一份文件中的两份记录。为什么可能?您不可能插入具有相同“_id”值的第二个文档。这将失败,并出现409错误。其次,不能用两个相同的键构造JSON文档。您不能生成这样的文档{u id:100,“No”:1,“No”:2}。您可以将所有数字放入一个数组,如{u id:100,“No”:[1,2]}。但是,我建议你按照我上面列出的例子来做。如果我们继续为同一属性插入(放置)设备信息会怎么样?例如,我继续插入带有“info\u a”键的文档,但是当我检索时,我只想要带有“info\u a”键的最新文档。如何编写map reduce以仅获取每个设备属性的最新文档
GET /$DATABASE/100

{
 "_id": "100",
 "_rev": "1-2902191555...",
 "No": ["1"]
}
{
 "_id": "100",
 "_rev": "1-2902191555...",
 "No": ["1","2"]
}
PUT /$DATABASE/100

{
 "_id": "100",
 "_rev": "1-2902191555...",
 "No":["1","2"]
}