使用 cblite 将数据插入 Couchbase lite,JSON 文件中每行一个文档 - Kotlin

inserting data into Couchbase lite using cblite, one document per line in JSON file - Kotlin

我正在使用 Couchbase lite,我想从 json 文件准备一个预构建的数据库。 每次我导入包含 12 个键的数组的文件时,该文件有 100 行,每行都是一个数组。

Cblite 将所有文件导入到单个文档中,这将不允许我使用基于键的文档内容,因为所有 12 个键都重复了 100 次。但我发现我可以将单个文件导入多个文档(每个line/array)并成为一个单独的文档。

但我无法使用 cblite 中提供的命令执行此操作,我从 cblite 收到错误消息,包括(无法解析 json)

DESTINATION : Database path, replication URL, or JSON file path:
    *.cblite2 :  Copies local database file, and assigns new UUID to target
    *.cblite2 :  With --replicate flag, runs local replication [EE]
    ws://*    :  Networked replication
    wss://*   :  Networked replication, with TLS
    *.json    :  Imports/exports JSON file (one doc per line)
    */        :  Imports/exports directory of JSON files (one per doc)

我可以重新排列 json 的文件以适合...但我无法为每个数组创建一个文件。

数组看起来像那样

{"_id":13,"id":"51333591918","owner":"126542062@N08","secret":"16f1758279","server":"65535","farm":66,"title":"dreamland","ispublic":1,"isfriend":0,"isfamily":0,"url_s":"https://live.staticflickr.com/65535/51333591918_16f1758279_m.jpg","height_s":148,"width_s":240}
{"_id":14,"id":"51333156717","owner":"97978797@N03","secret":"82f0fb71aa","server":"65535","farm":66,"title":"Tagpfauenauge","ispublic":1,"isfriend":0,"isfamily":0,"url_s":"https://live.staticflickr.com/65535/51333156717_82f0fb71aa_m.jpg","height_s":160,"width_s":240}
cblite -tool version: cblite tool 2.8 EE
Couchbase lite version : 2.8.6
Error: NullPointerException

我尝试了几个文件。一个 JSON 是 public 文件(我也用它作为测试)是 flickr json 响应 Flickr Photos Json File

我也使用了公司的文件,这些文件是POS的项目。

我什至尝试手动更改 json 文件的结构。但都导致相同的结果...(将所有数组放在一个文档中)

在数据库查询中我使用了这段代码

 val query = QueryBuilder
            .select(
                SelectResult.expression(Meta.id),
                SelectResult.property("owner"),
                SelectResult.property("secret"),
                SelectResult.property("server"),
                SelectResult.property("farm"),
                SelectResult.property("title"),
                SelectResult.property("ispublic"),
                SelectResult.property("isfriend"),
                SelectResult.property("isfamily"),
                SelectResult.property("url_s"),
                SelectResult.property("height_s"),
                SelectResult.property("width_s"),
            )
            .from(DataSource.database(database))

        val result = query.execute().allResults()

        for (rs in result) {
           // val doc = database.getDocument(photo.id)
            val id = rs.getString("id")
            val owner = rs.getString("owner")
            val secret = rs.getString("secret")
            val server = rs.getString("server")
            val farm = rs.getInt("farm")
            val title = rs.getString("title")
            val ispublic = rs.getInt("ispublic")
            val isfriend = rs.getInt("isfriend")
            val isfamily = rs.getInt("isfamily")
            val url_s = rs.getString("url_s")
            val height_s = rs.getInt("height_s")
            val width_s = rs.getInt("width_s")

            photoList.add(
                photo(
                    id!!,
                    owner!!,
                    secret!!,
                    server!!,
                    farm,
                    title!!,
                    ispublic,
                    isfriend,
                    isfamily,
                    url_s!!,
                    height_s,
                    width_s
                )
            )

我注意到在 Kotlin 中 SelectResult.all() 的选项没有带来任何东西,我必须一个一个地指定要获取的键。但这不是问题。

我经常设法在控制台中打印整个文档,但我永远无法使用其中的任何键。总是将 NullPointer 作为错误获取。

我仍在 couchbase 上学习,我想了解 N1QL,不幸的是我很少找到适合 Kotlin 的东西

有什么帮助吗?

请参阅 GitHub 中的示例存储库: https://github.com/biozal/cbmobile-split-data-example

我假设作为照片对象子对象的照片数组中的所有记录都是您想要保存到数据库中的内容,并且您希望每个对象都是一个新文档。

鉴于此,我编写了一个非常简单的 shell 脚本(使用“bash”),它执行以下操作:

  • 获取文档中的项目数

  • 遍历我需要为

    创建文档的项目数
  • 使用开源jq命令(https://github.com/stedolan/jq)获取内容并保存到名为json

    的变量中
  • 每个文档都需要一个唯一的键,所以我为此使用了 id 字段并将其从 json

    中提取出来
  • 最后我调用了 cblite 工具并让它根据我为项目提取的 ID 和它的 json 值创建文档

提供了名为查询-database.png 的此查询的屏幕截图。为了查询,我做了以下操作:

./cblite sampleDb.cblite2
 query --limit 10 ["=", [".owner"], "138459774@N07"]

该查询将 return 值所在的文档。