首页 > 解决方案 > 如何使用 couchbase 在数据库中添加对象数组而不丢失其他数据

问题描述

像这样

{
 id:1,
 name:john, 
 role:[
  {name:boss, type:xyz}, 
  {name:waiter, type:abc}
 ]
} 

我想将对象数组添加到“角色”而不丢失其他数据,但是新数据应该作为对象添加到数组中。

我试过

bucket.upsert(key, data, (error: CouchbaseError | null, result: any) => {})

其中 key 是文档的 id,data 是 {name:boss, type:xyz} 它表明 key 已经存在。

对于 db.upsert 它用新数据替换整个数据。

var query = N1qlQuery.fromString('UPDATE `myBucket` SET role = ' + '"' + data + '"' + ' WHERE meta().id =' + '"' + key + '"');

上面的代码显示了数据库中的角色:[对象对象]。

标签: node.jstypescriptcouchbasen1ql

解决方案


首先,我会考虑将 Couchbase Node SDK 升级到 3.x。

其次,我认为您正在寻找的是子文档 API,特别是“数组追加”操作。这允许您对文档的某些部分进行更改这是 2.6 文档中的一个示例:

bucket
  .mutateIn('customer123')
  .arrayAppend('purchases.complete', 777)
  .execute(function(err, res) {
    // purchases.complete is now [339, 976, 442, 666, 777]
  });

我不是一个 Node/JavaScript 开发人员,但我会假设你的例子是这样的:

bucket
  .mutateIn('1')
  .arrayAppend('role', theNewRoleYouWantToAdd)
  .execute(function(err, res) {
    
  });

旁注:对于您的 N1QL 示例,出现的原因[object object]可能与您的data对象将其作为字符串返回有关。您还应该查找“SQL 注入”,因为这样的 N1QL 代码可能很容易受到影响。查看占位符和参数化


推荐阅读