0

我的 couchdb 复杂查询处理出了点问题。

我有一个 map 函数,它发出由 6 个参数组成的复杂键,如下所示:

emit([doc.profileId,  doc.beamId, doc.name, doc.beambeanchId, "true", attachName], {beamdocId:doc._id, attachName:attachName})

我的查询参数(咖啡脚本)是这样的:

params =
startkey:[ profileId, beamId, namePrefix, beambeanchId, hasAttach, attachNamePrefix]
endkey:[
  profileId or "\ufff0",
  beamId or "\ufff0",
  namePrefixEnd or "\ufff0",
  beambeanchId or "\ufff0",
  hasAttachEnd,
  attachNamePrefixEnd or "\ufff0"]

问题是只有两个第一个正常工作,但其余的根本没有过滤。例如,当我将 namePrefixEnd 设置为不为 null 的值时,它并没有减少我的结果。

我用作为对象和数组的键进行了尝试。同样的故事,只有前两个有效。第三个被忽略。当我更改带有 namePrefixEnd 的例如 beamId 的顺序时,仍然只有前两个工作正常。

有什么想法有什么问题吗?couchdb 复杂键中的参数数量是否有限制?

我正在使用 nano 库来访问数据和 db.view 函数。

4

1 回答 1

0

行。我自己找到了答案。通常,startkey/endkey 中的键结构必须与发出的键完全匹配。

为了解决我的问题,我需要发出以后要查找的字段的所有可能组合。

例如:

emit([doc.profileId,  doc.beamId, doc.name, doc.beambeanchId, "true", attachName],
     {beamdocId:doc._id, attachName:attachName})
emit([doc.profileId,  doc.name, doc.beambeanchId, "true", attachName],
     {beamdocId:doc._id, attachName:attachName})
emit([doc.profileId,  doc.name, doc.beambeanchId, "true", attachName],
     {beamdocId:doc._id, attachName:attachName})
emit([doc.profileId,  doc.beambeanchId, "true", attachName],
     {beamdocId:doc._id, attachName:attachName})
emit([doc.profileId, attachName],
     {beamdocId:doc._id, attachName:attachName})

等等。现在我可以找到我需要的东西了。当然,为了使其防弹,最好使用对象键而不是数组,否则值可能会混淆。

于 2013-08-19T18:22:47.710 回答