【问题标题】:CouchDB Mango Queries (CouchDB 2.0.1)CouchDB 芒果查询 (CouchDB 2.0.1)
【发布时间】:2017-08-31 08:08:51
【问题描述】:

我正在尝试查询以下数据:

(获取自:https://dotnetcodr.com/2017/06/21/introduction-to-couchdb-with-net-part-17-starting-with-mango-queries/

{
      "post_code": 35801,
      "country": "United States",
      "country_abbreviation": "US",
      "places": [
        {
          "place_name": "Huntsville",
          "longitude": -86.5673,
          "state": "Alabama",
          "state_abbreviation": "AL",
          "latitude": 34.7269
        }
      ]
    },

    ..........

我的问题:

  1. 如何在查询中首先包含地点名称。

以下 javascript 没有给出结果:

{
    "selector": {
        "post_code": {"$eq": 35801}
    },
    "fields":["places.placename"]
}

post_code 上的正确索引:

{
  "index": {
    "fields": [
      "post_code"
    ]
  },
  "type": "json",
  "name": "post-code-index"
}

我确实设置了一个附加索引,如下所示:

{
  "index": {
    "fields": [
      "places.placename"
    ]
  },
  "type": "json"
}
  1. 如果数据有以下字段会怎样:

    "old_post_code_numbers": [12345, 67890, ......]

或:

  1. 如果数据有以下字段会怎样:

    "places": 
    {
      "place_name": "Huntsville",
      "longitude": -86.5673,
      "state": "Alabama",
      "state_abbreviation": "AL",
      "latitude": 34.7269
    }
    

JSON 有很多形式,我很难掌握这类查询所需的 javascript 背后的原理。 我知道这很简单。一定很简单。

非常感谢我应该/可以访问的任何指导或网站。

编辑:

我设法让以下内容在在线 javascript 测试站点上运行,但我仍然无法在 CouchDB Mango 中运行。这在 CouchDB 中肯定是可能的。???

var xxx=
     {
      "post_code": 82941,
      "country": "United States",
      "country_abbreviation": "US",
      "places": [
        {
          "place_name": "Pinedale",
          "longitude": -109.8561,
          "state": "Wyoming",
          "state_abbreviation": "WY",
          "latitude": 42.8543
        }]
 }

console.log(xxx.places[0].place_name);

【问题讨论】:

  • 您的请求的棘手之处在于您试图返回数组元素属性。因此,我认为 Cloudant/CouchDB 不支持它。为此,您可以使用 map/reduce。
  • 嗨@Alexis。感谢您对地图减少的评论。我添加了一个编辑(上图),但可能无关紧要。
  • @Alexis 是的,map/reduce 与 places[0].place_name 合作。谢谢。
  • 嗨@Alexis。如果您有时间,请看一下我提出的答案。

标签: javascript json couchdb-mango couchdb-2.x


【解决方案1】:

我已经能够得到我的问题第 1 部分的结果(基于对this question 的回答),如下所示:

我的索引:

{
"type": "json",
 "def": {
  "fields": [
   {
    "places.0.place_name": "asc"
   }
  ]
 }
}

我的查询:

{
  "selector": {
    "places.0.place_name": {
        "$gte": null
      }

  },
  "fields": [
    "_id",
    "places.0.place_name"
  ],
  "sort": [
    {
      "places.0.place_name": "asc"
    }
  ]
}

结果:

{"docs":[
{"_id":"254b9a8c7a46934363076cc3d9034082","places":{"0":{"place_name":"Aberdeen"}}},
{"_id":"254b9a8c7a46934363076cc3d9037559","places":{"0":{"place_name":"Altavista"}}},
{"_id":"254b9a8c7a46934363076cc3d900e4d2","places":{"0":{"place_name":"Anchorage"}}},
{"_id":"254b9a8c7a46934363076cc3d900f3b9","places":{"0":{"place_name":"Anchorage"}}},
{"_id":"254b9a8c7a46934363076cc3d902c738","places":{"0":{"place_name":"Ashland"}}},
{"_id":"254b9a8c7a46934363076cc3d901a2f2","places":{"0":{"place_name":"Atlanta"}}},
{"_id":"254b9a8c7a46934363076cc3d901a374","places":{"0":{"place_name":"Atlanta"}}} 
.................

在这种情况下,我省略了"post_code": {"$eq": 35801},但可以添加它而不会发生错误。

第三部分:

索引:

{
  "index": {
    "fields": [
      {
        "places.place_name": "asc"
      }
    ]
  },
  "type": "json"
}

查询:

{
  "selector": {
    "places.place_name": {
        "$gte": null
      }

  },
  "fields": [
    "places.place_name"
  ],
  "sort": [
    {
      "places.place_name": "asc"
    }
  ]
}

Result:

{"docs":[
{"places":{"place_name":"Anchorage"}},
{"places":{"place_name":"Anchorage"}},
{"places":{"place_name":"Huntsville"}},
{"places":{"place_name":"Huntsville"}},
{"places":{"place_name":"Phoenix"}},
{"places":{"place_name":"Phoenix"}}
]}

第 2 部分:

索引:

{
  "index": {
    "fields": [
      {
        "old_post_code_numbers": "asc"
      }
    ]
  },
  "type": "json"
}

查询:

{
  "selector": {
    "old_post_code_numbers": {
        "$gte": null
      }

  },
  "fields": [
    "places.place_name",
    "old_post_code_numbers"
  ],
  "sort": [
    {
      "old_post_code_numbers": "asc"
    }
  ]
}

结果:

{"docs":[
{"places":{"place_name":"Huntsville"},"old_post_code_numbers":[12345,67890]},
{"places":{"place_name":"Huntsville"},"old_post_code_numbers":[12345,67890]},
{"places":{"place_name":"Anchorage"},"old_post_code_numbers":[12345,67890]},
{"places":{"place_name":"Anchorage"},"old_post_code_numbers":[12345,67890]},
{"places":{"place_name":"Phoenix"},"old_post_code_numbers":[12345,67890]},
{"places":{"place_name":"Phoenix"},"old_post_code_numbers":[12345,67890]}
]}

最后一个使用:"old_post_code_numbers.0" 的例子给出:

{"docs":[
{"places":{"place_name":"Huntsville"},"old_post_code_numbers":{"0":12345}},
{"places":{"place_name":"Huntsville"},"old_post_code_numbers":{"0":12345}},
{"places":{"place_name":"Anchorage"},"old_post_code_numbers":{"0":12345}},
{"places":{"place_name":"Anchorage"},"old_post_code_numbers":{"0":12345}},
{"places":{"place_name":"Phoenix"},"old_post_code_numbers":{"0":12345}},
{"places":{"place_name":"Phoenix"},"old_post_code_numbers":{"0":12345}}
]}

我会很感激任何 cmets。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    相关资源
    最近更新 更多