我的文档结构如下:
{
"_id": "6ed3d427045228dce9e3b38d111cb046",
"_rev": "1-952bddae5572fbf2b0ce4a165c19c98b",
"type": "USER",
"name": "ABC",
"email": "abc@gmail.com",
"phone": "024578963"
}这是NodeJS应用程序,我正在使用couchdb-nano。出于排序的目的(比如获取用于分页的数据),我为上述字段(name、email、phone)创建了一个索引。
文档中引入了一个名为created_date的新字段,所有最新文档都包含created_date,如下所示:
{
"_id": "6ed3d427045228dce9e3b38d111cb046",
"_rev": "1-952bddae5572fbf2b0ce4a165c19c98b",
"type": "USER",
"name": "ABC",
"email": "abc@gmail.com",
"phone": "024578963",
"created_date": 1570528394252
}因此,自特定时间以来所有最新文档都由created_date组成,而旧文档在文档中没有created_date字段。
当我尝试像下面这样排序时:
const q = {
selector : {
type: { "$eq": "USER" },
},
fields : ['name', 'email', 'phone', 'created_date'],
limit: 100,
skip: 10,
sort : [{"created_date":"asc"}]
};
await prodresdb.find(q);我将无法获取不包含created_date的旧文档。这是因为created_date索引不会索引旧文档,因为这些文档没有created_date字段。
我相信其他人也有这个问题,需要弄清楚...如何克服这一点?有什么CouchDB方法可以解决这个问题吗?解决这类问题的最佳实践是什么?
发布于 2019-10-12 14:04:20
我做了几个测试,发现如果文档不包含sort中指定的字段(属性),CouchDB就不会在_find结果中包含文档。在我看来,这是一个错误,因为sort意外地减少了过滤结果。当将CouchDB与PouchDB一起使用时,这尤其令人讨厌,因为后者的工作方式与预期相同(也会返回缺少属性的文档)。
按照上面注释中的建议,向现有文档添加缺少的属性可能会解决您的问题。然而,在许多情况下(例如,对于数字和布尔值属性),这不是一个可行的解决方案,因为文档内容可能被篡改。
对您的问题的简短回答:在许多情况下,没有直接的CouchDB方法来解决这个问题。
更新:
有趣的是,类似的产品Couchbase Server通过允许fine-grained control over the sort-procedure通过missing字段来解决这个问题-全文搜索结果。
missing :为指定排序的字段中缺少值的文档指定排序过程。missing的值可以是first,在这种情况下,缺少值的结果显示在其他结果之前;或者last (默认值),在这种情况下,它们显示在。
之后
https://stackoverflow.com/questions/58336933
复制相似问题