0

我有一个 CouchDB 数据库,它使用查询语言 Mango - 这似乎与 Cloudant 的查询语言相同。

我正在尝试搜索和比较两个字段,并且仅在它们相等时才返回相关结果。

例如:

{
 "_id": "ACCEPT0",
 "_rev": "1-92ea4e727271aefd0a2befed0d4bb736",
 "OfferID": "OFFER0"
}

{
 "_id": "ACCEPT1",
 "_rev": "3-986ca6e717b225ac909d644de54d5f7d",
 "OfferID": "OFFER3"
}

{
 "_id": "OFFER0",
 "_rev": "1-2af5f5c7b1c59dd3f0997f748a367cb2",
 "From": "merchant1",
 "To": "customer1"
}

{
 "_id": "OFFER1",
 "_rev": "6-f0927c5d4f9fd8a2d2b602f1c265d6d5",
 "From": "merchant1",
 "To": "customer2"
}

我试图提出一个查询,在本例中,它将返回“OFFER0”——因为 OF​​FER0 存在于“OfferID”中

编辑(澄清):查询需要能够选择所有以OFFER 开头并且存在于OfferID 字段中的_id。

我知道我可以用视图来设置它(从:Cloudant query to return records where 2 fields are equal可以看出),但我需要在 Mango 查询中使用它,因为它将在 Hyperledger 上运行

4

1 回答 1

3

您可以使用以下查询轻松返回_id字段以“OFFER”开头的文档:

{
  "selector": {
    "_id": {
      "$regex": "^OFFER"
    }
  }
}

但这可能效率低下,因为 Cloudant 必须扫描整个数据库,_id使用该正则表达式测试每个文档字段。

设计数据的更好方法可能是有一个type字段来区分数据库中的文档类型,例如

{
 "_id": "OFFER0",
 "_rev": "1-2af5f5c7b1c59dd3f0997f748a367cb2",
 "type": "offer",
 "From": "merchant1",
 "To": "customer1"
}

然后查询返回所有文档,其中type = 'offer'变为:

{
  "selector": {
    "type": "offer"
  }
}

我不完全理解您所说的“存在于 OfferID 字段中”的问题部分。但重要的是要注意 Cloudant Query & Mango 只能查询单个文档 - 您不能说“让我获取所有提供的文档,而另一个文档具有特定属性”。在每个文档中包含您需要的所有数据,然后您就可以干净地查询它。

于 2017-08-30T13:17:11.420 回答