使用索引修改文档后,PouchDB find()查询停止工作

编程入门 行业动态 更新时间:2024-10-26 12:21:23
本文介绍了使用索引修改文档后,PouchDB find()查询停止工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我在React Native v0.46.2项目中使用本地PouchDB实例。我创建一个数据库,向其中添加记录,执行Mango查询(搜索具有特定事件ID的文档),该查询将按预期工作。然后,我修改一条记录,执行与以前相同的查询,结果不正确。似乎只是返回我刚刚修改的文档,而没有其他应返回的文档。如果以后再打印所有文档,则会显示所有文档,因为它们应包含新的修改。

I'm using a local PouchDB instance in a React Native v0.46.2 project. I create a database, add records to it, perform a Mango query (search for docs with a specific event ID), and the query works as expected. I then modify one record, perform the same query as before, and the results are not correct. It seems to just return the document I just modified, but none of the other documents that should be returned. If I print all docs afterwards, it shows all the documents as they should be including the new modification.

我关闭了索引,查询工作了。但是我确实需要索引才能对大量数据执行快速搜索。

I've turned off the index, and the queries work. But I do need the indexes in order to perform quick searches over large amounts of data.

为什么修改文档后查询无法正常工作?

Why do my queries stop working correctly after modifying a doc?

我创建了以下示例数据代码来演示该问题。我按此顺序执行以下操作:

I've created the sample data code below to demonstrate the issue. I do the following actions in this order:

  • 创建索引
  • 使用空白查询的索引数据库
  • 将批量文档添加到数据库
  • 执行查询
  • 修改文档
  • 再次执行查询。
  • Create index
  • index db with blank query
  • add bulkdocs to db
  • perform query
  • modify doc
  • perform query again.

`

testFunction() { //Dummy data let mockData = [{ '_id': '1', 'event_id': '136471', }, { '_id': '2', 'event_id': '136471', }, { '_id': '3', 'event_id': '136471', }, { '_id': '4', 'event_id': '136472', }]; //Create DB this.testDB = new PouchDB('DBTest'); let thisTestDB = this.testDB; this.testDB.createIndex({ index: { fields: ['event_id'], ddoc: 'testTicketsDesignDoc', }, }) .then( (result) => { console.log('Indexing for Mango complete'); //Index mango with initial blank query thisTestDB.find({ selector: {}, use_index: 'testTicketsDesignDoc', limit: 0, }) .then( (result) => { console.log('Indexing with blank Mango query complete'); //Add docs to database thisTestDB.bulkDocs(mockData) .then( (result) => { console.log('Bulkdocs successfully added to database.'); //Perform 1st query before modifying docs thisTestDB.find({ selector: { 'event_id': '136471', }, use_index: 'testTicketsDesignDoc', }) .then( (searchResult) => { console.log('1st Mango query complete'); console.log(searchResult); //Now modify a doc thisTestDB.get('1') .then( (doc) => { //Make any modifications to doc here thisTestDB.put(doc) .then ( (putResult) => { console.log(`Modifying doc successful: ${JSON.stringify(putResult)}`); //Perform second query after modifying docs thisTestDB.find({ selector: { 'event_id': '136471', }, use_index: 'testTicketsDesignDoc', }) .then( (searchResult) => { console.log('2nd Mango query complete'); console.log(searchResult); } ); } ) .catch( (error) => { console.log(`Error modifying doc: ${error}`); } ); } ) .catch( (error) => { console.log(`Error modifying doc: ${error}`); } ); } ) .catch( (error) => { console.log(`Error performing first query: ${error.message}`); } ); } ) .catch( (error) => { console.log(`Error adding bulk docs: ${error}`); } ); } ) .catch( (error) => { console.log(`Error performing initial indexing query: ${error}`); } ); } ) .catch( (err) => { console.log(`Error - ${JSON.stringify(err)}`); } ); }

此外,除了修改文档外,我还尝试了删除文档然后进行压缩,然后放入新的文档副本。在索引搜索中,我仍然遇到相同的问题。

Also, instead of modifying a doc, I've also tried deleting the doc and compacting, then putting a new copy of the doc in. I still run into the same problems searching over the index.

推荐答案

我试图通过创建一个包含您的JavaScript代码的 index.html 文件和一个 so.js 文件来重现您的问题状况(稍加修改),并且我发现第一个查询和第二个查询都按预期运行,没有任何问题,控制台日志如下所示。注意第二个查询返回一个带有 _rev: 2-d36 ... 的文档,这是修改后的文档:

I tried to reproduce your problem conditions by creating an index.html file and a so.js file containing your JavaScript code (with little modification), and I observe that 1st and 2nd queries both work as expected without any problem, the console log are shown below. Notice the second query returns a doc with a _rev: "2-d36..." which is the modified doc:

只需仔细检查一下,这是我的 index.html 文件:

Just to double-check, here is my index.html file:

<html> <head> <meta charset="utf-8"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <meta http-equiv="X-UA-Compatible" content="IE=edge"/> <title>Pouch Debug</title> </head> <body> <script src="//cdn.jsdelivr/npm/pouchdb@6.4.3/dist/pouchdb.min.js"></script> <script src='//unpkg/pouchdb@6.4.3/dist/pouchdb.find.js'></script> <script src='./so.js'></script> </body> </html>

我从 index.html 文件由Python 3.5如下所示:

I run my HTTP server from within the directory of my index.html file by Python 3.5 like below:

$ python3.5 -m http.server Serving HTTP on 0.0.0.0 port 8000 ...

这是我的 so .js 文件,该文件在我的 index.html 文件中使用。我对您的代码进行了很少的更改:

Here is my so.js file, which is used inside my index.html file. I made very little changes to your code:

testFunction(); function testFunction() { //Dummy data let mockData = [{ '_id': '1', 'event_id': '136471', }, { '_id': '2', 'event_id': '136471', }, { '_id': '3', 'event_id': '136471', }, { '_id': '4', 'event_id': '136472', }]; //Create DB //this.testDB = new PouchDB('DBTest'); let thisTestDB = new PouchDB('DBTest') /*this.testDB;*/ thisTestDB.createIndex({ index: { fields: ['event_id'], ddoc: 'testTicketsDesignDoc', }, }) .then( (result) => { console.log('Indexing for Mango complete'); //Index mango with initial blank query thisTestDB.find({ selector: {}, use_index: 'testTicketsDesignDoc', limit: 0, }) .then( (result) => { console.log('Indexing with blank Mango query complete'); //Add docs to database thisTestDB.bulkDocs(mockData) .then( (result) => { console.log('Bulkdocs successfully added to database.'); //Perform 1st query before modifying docs thisTestDB.find({ selector: { 'event_id': '136471', }, use_index: 'testTicketsDesignDoc', }) .then( (searchResult) => { console.log('1st Mango query complete'); console.log(searchResult); //Now modify a doc thisTestDB.get('1') .then( (doc) => { //Make any modifications to doc here thisTestDB.put(doc) .then ( (putResult) => { console.log(`Modifying doc successful: ${JSON.stringify(putResult)}`); //Perform second query after modifying docs thisTestDB.find({ selector: { 'event_id': '136471', }, use_index: 'testTicketsDesignDoc', }) .then( (searchResult) => { console.log('2nd Mango query complete'); console.log(searchResult); } ); } ) .catch( (error) => { console.log(`Error modifying doc: ${error}`); } ); } ) .catch( (error) => { console.log(`Error modifying doc: ${error}`); } ); } ) .catch( (error) => { console.log(`Error performing first query: ${error.message}`); } ); } ) .catch( (error) => { console.log(`Error adding bulk docs: ${error}`); } ); } ) .catch( (error) => { console.log(`Error performing initial indexing query: ${error}`); } ); } ) .catch( (err) => { console.log(`Error - ${JSON.stringify(err)}`); } ); }

更多推荐

使用索引修改文档后,PouchDB find()查询停止工作

本文发布于:2023-10-30 03:26:25,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1541623.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:索引   文档   工作   PouchDB   find

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!