使用 loopback.js 和 MongoDB 自动递增

Posted

技术标签:

【中文标题】使用 loopback.js 和 MongoDB 自动递增【英文标题】:auto-increment using loopback.js and MongoDB 【发布时间】:2016-01-29 00:29:38 【问题描述】:

我想使用环回自动增加 mongodb 文档数。

我在mongo中做了函数

 function getNextSequence(name) 
   var ret = db.counters.findAndModify(
          
            query:  _id: name ,
            update:  $inc:  seq: 1  ,
            new: true
          
   );

   return ret.seq;



db.tweet.insert(

   "_id" : getNextSequence("userid"),
  "content": "test",
  "date": "1",
  "ownerUsername": "1",
  "ownerId": "1"

)

它在 mongo shell 中工作。

但是,当我使用 loopback.js 浏览器 (http://localhost:3000/explorer/) 插入时,它无法正常工作。 显示 400 错误(SytaxError)代码。

我不能在 loopback rest API 中使用 mongo 函数?

我认为问题在于这一行中的引号 getNextSequence("userid"),

【问题讨论】:

您是否尝试过“保存前”的解决方案? 【参考方案1】:

使用属性valuecollection 创建集合counters


  "name": "counters",
  "base": "PersistedModel",
  "idInjection": true,
  "options": 
    "validateUpsert": true
  ,
  "properties": 
      "type": "number",
      "collection": "string"

  ,
  "validations": [],
  "relations": ,
  "acls": [
    
      "accessType": "*",
      "principalType": "ROLE",
      "principalId": "$everyone",
      "permission": "ALLOW"
    
  ],
  "methods": []

现在假设您的自动增量集合名称 tweets

将此值插入counters


  "value" : 0, 
  "collection" : "tweet"

现在 common/models/tweet.js

tweet.observe('before save', function (ctx, next) 

        var app = ctx.Model.app;

        //Apply this hooks for save operation only..
        if(ctx.isNewInstance)
            //suppose my datasource name is mongodb
            var mongoDb = app.dataSources.mongodb;
            var mongoConnector = app.dataSources.mongodb.connector;
            mongoConnector.collection("counters").findAndModify(collection: 'tweet', [['_id','asc']], $inc:  value: 1 , new: true, function(err, sequence) 
                if(err) 
                    throw err;
                 else 
                    // Do what I need to do with new incremented value sequence.value
                    //Save the tweet id with autoincrement..
                    ctx.instance.id = sequence.value.value;

                    next();

                 //else
            );
         //ctx.isNewInstance
        else
            next(); 
        
    ); //Observe before save..

【讨论】:

【参考方案2】:

我很想为 Robins Answer 再加 1 分,您可以添加 upsert:true 以便在文档不存在时自动创建文档

tweet.observe('before save', function (ctx, next) 

    var app = ctx.Model.app;

    //Apply this hooks for save operation only..
    if(ctx.isNewInstance)
        //suppose my datasource name is mongodb
        var mongoDb = app.dataSources.mongodb;
        var mongoConnector = app.dataSources.mongodb.connector;
        mongoConnector.collection("counters").findAndModify(collection: 'tweet', [['_id','asc']], $inc:  value: 1 , new: true,upsert:true, function(err, sequence) 
            if(err) 
                throw err;
             else 
                // Do what I need to do with new incremented value sequence.value
                //Save the tweet id with autoincrement..
                ctx.instance.id = sequence.value.value;

                next();

             //else
        );
     //ctx.isNewInstance
    else
        next(); 
    
); //Observe before save..

【讨论】:

【参考方案3】:

您可以在此示例中为环回 4 执行类似操作

let last_record = await this.testRepository.findOne(order: ['id DESC']);
if(last_record) invoice.id = last_record.id+1;

这将生成带有属性的模型:

@property(
    type: 'number',
    id: true,
    default: 1,
    generated: false
  )
  id: number;

希望这有帮助,如果有任何其他代码,请写信给我。谢谢

【讨论】:

【参考方案4】:

如果您想在环回方法中直接使用 MongoDB 运算符,您需要启用“allowExtendedOperators”选项,您可以在每个模型或数据源级别执行此操作(将适用于使用数据源的所有模型) .

数据源.json:

  "MongoDs": 
    "host": "127.0.0.1",
    "port": 27017,
    "url": "mongodb://localUser:MYPASSWORD!@127.0.0.1:27017/test-database",
    "database": "test-database",
    "password": "MYPASSWORD!",
    "name": "MongoDs",
    "user": "localUser",
    "useNewUrlParser": true,
    "connector": "mongodb",
    "allowExtendedOperators": true
  ,

【讨论】:

以上是关于使用 loopback.js 和 MongoDB 自动递增的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 安装和配置使用

arcmap可以和mongodb连接使用吗

MongoDB的学习和使用

MongoDB 索引的使用, 管理 和优化

MongoDB:存储和何时使用关系

Node 使用mongodb的mongoose是否很坑