我有一个只有一个节点(我们称之为 localhost)的 Couchbase 集群,我需要将一个非常大的存储桶(我们称之为 XXX)中的所有数据导出到 CSV 文件中。
现在这似乎是一项非常简单的任务,但我找不到让它发挥作用的方法。
根据 Couchbase http://docs.couchbase.com/admin/admin/CLI/cbtransfer_tool.html有关 cbtransfer 工具的(非常糟糕)文档,他们说这是可能的,但他们没有清楚地解释。如果您希望以 csv 格式进行传输(?),他们只是添加一个标志,但它不起作用。也许已经这样做过的人可以帮我一把?
使用文档,我已经能够使用以下命令获得我想要获得的结果(一个干净的 CSV 文件,其中包含 XXX 存储桶中的所有文档):
/opt/couchbase/bin/cbtransfer http://localhost:8091 /path/to/export/output.csv -b XXX
但我得到的是 /path/to/export/output.csv 实际上是一个包含很多文件夹的文件夹,它存储某种 json 元数据,可用于恢复 Couchbase 另一个实例中的 XXX 存储桶。
有人能够将 Couchbase 存储桶(Json 文档)中的数据导出到 CSV 文件中吗?
我正在尝试使用 powermockito模拟CouchbaseCluster.create()的静态方法。这是我的测试课。
@PrepareForTest(CouchbaseCluster.class)
public class IAMKafkaConsumerTest extends PowerMockTestCase {
private IAMKafkaConsumer iamKafkaConsumer;
private CouchbaseCluster mockCouchbaseCluster;
private Bucket mockBucket;
@ObjectFactory
public IObjectFactory getObjectFactory() {
return new org.powermock.modules.testng.PowerMockObjectFactory();
}
@Test
public void happyPath()
{
PowerMockito.mockStatic(CouchbaseCluster.class);
}
}
Run Code Online (Sandbox Code Playgroud)
我的项目 pom 包括以下依赖项:
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-testng</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-testng-agent</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
当我通过 TestNG 框架运行测试时,我收到此错误日志。
java.lang.NoClassDefFoundError: org/mockito/internal/creation/CglibMockMaker …
在我们的spring-boot 2.0.4.RELEASE
应用程序中,我们使用Couchbase version 5.5.1 build 3511
with Spring
。
我们在 Repository 接口中添加了一个新的删除方法:
public interface CatRepository extends CouchbaseRepository<Cat, String> {
long deleteAllByName(String name);
Run Code Online (Sandbox Code Playgroud)
调用该方法时,文档从存储桶中删除,但我们收到以下错误:
返回原始类型的查询预计将返回 1 个结果,得到 X
该X
值根据删除的项目数而变化。在下面的示例中,删除了 27 个项目。
这是完整的堆栈跟踪:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.couchbase.core.CouchbaseQueryExecutionException: Query returning a primitive type are expected to return exactly 1 result, got 27] with root cause
org.springframework.data.couchbase.core.CouchbaseQueryExecutionException: Query returning a primitive type are expected to …
Run Code Online (Sandbox Code Playgroud) 我是 Couchbase 的新手,遇到了一种让我非常困扰的行为。假设我已经在 C# 中定义了这个类:
public class Thing
{
public string Property1 { get; set; }
public string Property2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我将它存储在 Couchbase 中名为 ThingBucket 的存储桶中。现在,如果我进入 Couchbase 查询工作台并输入:
SELECT Property1, Property2 FROM ThingBucket
Run Code Online (Sandbox Code Playgroud)
我得到的是一个 JSON 对象,它将直接反序列化为一个 Thing 数组:
[
{
"Property1": "Value",
"Property2": "Value"
}
]
Run Code Online (Sandbox Code Playgroud)
这很好,因为我不需要做任何特别的事情就可以将它反序列化为事物。Couchbase C# 驱动程序调用 Json.NET 进行反序列化,并且它可以正常工作。
但是,如果我输入:
SELECT * FROM ThingBucket
Run Code Online (Sandbox Code Playgroud)
我没有得到一系列的东西。我得到了完全不同的东西:
[
{
"ThingBucket": {
"Property1": "Value",
"Property2": "Value"
}
}
]
Run Code Online (Sandbox Code Playgroud)
现在,我的 C# 代码中根本不存在一组形状,而不是 Thing 数组。它是一个对象数组,其中每个对象都有一个作为 Thing 的属性。为了让它反序列化到 Thing,我必须用 [JsonProperty] …
我有一个使用 Couchbase lite 的 android 应用程序,因为我需要离线模式。
当我对设备上的文档进行多次更改时,我获得的第一个同步文档的修订号大于 1。
是否可以获得该文档的先前修订版?
大卫
当我SELECT * FROM projects ORDER BY createdAt desc
在 Couchbase Web UI 中运行此查询时,结果按原样排序,但不是在 Java 中。
Java代码
@Override
public List<Project> getAllProjects(String requestedOrder, Integer page, Integer pageOffset) {
String statement = "SELECT projects.* FROM projects ORDER BY $requestedOrder DESC OFFSET $offset LIMIT $pageOffset";
QueryOptions queryOptions = queryOptions().parameters(
JsonObject.create().put("offset", (page - 1) * pageOffset)
.put("pageOffset", pageOffset)
.put("requestedOrder", requestedOrder));
QueryResult queryResult = couchbaseCluster.query(statement, queryOptions);
return queryResult.rowsAs(Project.class);
}
Run Code Online (Sandbox Code Playgroud)
网页界面结果
[
{
"projects": {
"createdAt": 1603804921950,
"name": "Third Project",
...
}
},
{
"projects": { …
Run Code Online (Sandbox Code Playgroud) 从对象数组中选择值的正确方法是什么?
想要检索不同的评论列表。
[
"comment 1",
"comment 2",
"comment 3",
"comment 4"
]
Run Code Online (Sandbox Code Playgroud)
当前 N1QL 查询
SELECT links[*].comment FROM `my-db`
WHERE type = "links" AND ANY l IN links SATISFIES l.comment IS NOT MISSING END
Run Code Online (Sandbox Code Playgroud)
结果
[
{
"comment": [
"comment 1"
]
},
{
"comment": [
"comment 1",
"comment 2"
]
},
{
"comment": [
"comment 3",
"comment 4"
]
}
]
Run Code Online (Sandbox Code Playgroud)
给定一系列包含注释字段的文档:
{
"type": "links",
"links": [
{
"comment": "comment 1"
}
]
}
{
"type": "links",
"links": [ …
Run Code Online (Sandbox Code Playgroud) 我们最近从关系(MySQL)转向NoSQL(couchbase).基本上它是社交手机游戏的后端.我们在扩展后端以处理越来越多的用户时遇到了很多问题.当使用MySQL加载时,由于多个表之间存在大量连接,因此用户花费了大量时间.在加载数据后,我们看到了一个巨大的改进,特别是在加载数据时,因为大多数数据保存在单个文档中.
在缺点方面,就查询而言,couchbase似乎也有很多限制.Couchbase替代SQL查询是视图.虽然我们设法使用map-reduce处理大多数查询,但我们真的很难弄清楚如何处理基于时间的查询.例如,我们需要根据timestamp属性过滤用户.如果时间少于当前时间,我们只需要一个用户:
if(user.time < new Date().getTime() / 1000)
Run Code Online (Sandbox Code Playgroud)
会发生的情况是,一旦将用户的时间设置为某个未来的时间,它就会被豁免于此视图,这是期望的行为,但除非我们更新它,否则它永远不会被添加回视图 - 文档仅在其视图中被重新编入索引时更新.
我们现在的解决方案是加载前x个用户文档,然后在我们的应用程序中检查时间.对user.time属性进行排序,以便我们获得那些时间小于或接近当前时间的用户.但我不确定这是否真的会在实时环境中起作用.理想情况下,我们希望在应用程序级别避免这些类型的检查.
当我们需要检查多个基于时间的属性时,也有时候例如匹配.我们当前的策略在这种情况下不起作用,并且我们经常从视图中获取在应用程序中完成时未通过这些检查的文档.如果已经解决类似问题的人可以分享他们的经验,我将非常感激.提前致谢.
更新:
我们尝试使用仅适用于一个密钥的范围查询.就像我在大多数情况下所说的那样,我们有多个基于时间的键意味着多个范围不起作用.
根据我的理解Bucket
,Couchbase中的a Database
与CouchDb中的 a node
相同,a 与a 相同document
.这些扣除是否正确?
那么,new Bucket
使用NodeJs SDK创建代码的代码是什么?我找不到相关的文档.