【问题标题】:AutoIncrement _id in pouchdbpouchdb 中的 AutoIncrement _id
【发布时间】:2017-01-17 09:33:15
【问题描述】:

我在 pouchDB 中实现了一个队列,其中每条记录都存储为一个单独的文档。每条记录都类似于一个发布请求,因此当用户离线时,我可以将请求保存在队列中,然后在用户在线时将其推送到服务器。所有请求都必须按照它们生成的相同顺序进行处理。但问题是袋子数据库中没有 _id 序列。所以每次生成一个随机id,序列就丢失了。我该怎么做才能以与保存在数据库中的顺序相同的顺序获取记录。我正在使用 pouchDB 和 IonicFramework。 谢谢。

【问题讨论】:

  • 为什么不使用时间戳作为_id
  • 我试过了。它工作得很好。谢谢
  • @fiatjaf 您应该在答案中提及相同的内容(出于社区目的)
  • 我不这么认为。这不是一个“规范”的答案。它不适合每个人的用例,这就是我问的原因。简短而绝对正确的答案是:在 PouchDB 中不可能有自动增量_id

标签: ionic-framework pouchdb nosql


【解决方案1】:

来自@fiatjaf: 在 PouchDB 中自动递增 _id 是不可能的(或不是最优的)

但是,您可以选择使用时间戳作为_id

例如,在您的 doc 对象中:

doc = { _id : Date.now(), name: 'Pouch DB', description: 'The best DB' }

【讨论】:

  • 这个例子怎么样?
  • @AndresChica 更新了示例
【解决方案2】:

Pouchdb 帖子

自动生成

db.post(doc, [options], [callback])

创建一个新文档并让 PouchDB 为它自动生成一个 _id。

https://pouchdb.com/api.html

【讨论】:

    【解决方案3】:

    自动增量是不可能的。然而,这就是我所做的。

    假设您正在从表单中发布内容。 你收到它是这样的

    const fromform = req.body.fieldname;
    

    然后在添加它并增加 _id 之前,您可以调用 alldocs 方法。

    database.allDocs({include_docs: true,descending: true,limit:1}).then(function(result){
    // the rest of the code goes here
    });
    

    然后您可以使用结果进行迭代并为其添加一个数字

    result.rows.map(function(item) {
                var pusher=JSON.stringify(item.id, null, 4);
                var idf=parseInt(pusher.slice(1,-1),10)
                var addidf=idf+1;
                var sid=addidf.toString();
                doc = {
                    _id : sid,
                    name: 'field_from_form',
                    tagline : fromform // this is also field from form
                    }
                        database.put(doc, function(err, response) {
                            if (err) {
                            return console.log(err);
                            } else {
                            console.log("Document created Successfully");
                            res.send("Collection Updated" + JSON.stringify(doc));
                            }
                            console.log("The new array in add tag is pushed is : "+addidf);   
                            });
                 });
            }, function(error) {
                res.status(400).send(error);
    

    结果行将为您提供所有文档,但是我们已按降序对其进行排序并将其限制为一个。你有一个对象,所以我们对它进行了攻击。默认情况下 pouch 将返回一个字符串,因此我们对其进行解析并切片引号。然后我们必须添加 +1 来增加它。然后小袋将不接受数字,所以你必须再次将其转换为字符串(phew``)/你完成了。

    是的,这不是一个好方法,但与小袋的照明速度有关。我想我们可以忽略它。

    还有另一种方式。 你也可以调用

    db.info().then(info=> console.log(info.doc_count))
    

    上述方法要快得多,并且会为您节省大量开销,但是您需要在一定程度上以 [object Object] 和 [object Promise] 为导向。我相信诺言会引起人们的注意。

    一切顺利!!

    【讨论】:

      猜你喜欢
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 1970-01-01
      • 2016-04-06
      • 2019-12-03
      • 1970-01-01
      相关资源
      最近更新 更多