mongodb 模型以外的集合的环回远程方法中的自定义 CRUD

custom CRUD in loopback remote-method for collection other than model for mongodb

我正在为我的项目使用 Loopback。我为测试模型创建了一个模型 'test' 和一个远程方法 'createOrder'。

'use strict';

module.exports = function (Test) {
    /**
     * 
     * @param {number} amount 
     * @param {Function(Error)} callback
     */

    Test.createOrder = function (amount, callback) {
        // Add log to the logs collection 
        callback(null);
    };
};

我正在使用 MongoDB 作为数据源。

{
  "db": {
    "name": "db",
    "connector": "memory"
  },
  "paymentDS": {
    "host": "localhost",
    "port": 27017,
    "url": "",
    "database": "test",
    "password": "",
    "name": "testDS",
    "user": "",
    "useNewUrlParser": true,
    "connector": "mongodb"
  }
}

我想从测试模型中定义的 createOrder 远程方法将日志插入到日志集合中。 我该怎么做?

如果您的日志集合有模型,您可以:

Test.createOrder = function(amount, callback) {
    // ...
    Test.app.models.Log.create(/*...*/)
    // ...
};

否则,您可以直接从数据库连接器访问日志收集:

Test.createOrder = function(amount, callback) {
    // ...
    Test.app.datasources.db.collection("logs").insert(/**/);
    // ...
};

为了创建自定义 CRUD 操作,您可以使用环回远程方法实现。 loopback 中的每个模型都继承了 Persistent class,您可以使用其默认方法从远程方法执行 CRUD 操作。检查下面的示例,

创建操作

下面的示例将在 MongoDB 中创建一个文档,并在日志集合中插入一条记录。

Test.createOrder = function (amount, callback) {

    // Inserting object into database        
    Test.create({amount: amount, /*data to insert*/}, function(err, data) {

        // Adding logs to the logs collection 
        Test.app.models.Log.insert({ message: "order created", /*data to insert*/}, function(err, data) {
            callback(null);
        });
    });
};

持久模型中有更多方便的方法可用于在不同情况下执行创建操作,如upsertfindOrCreatesave

读取操作

下面的示例将根据应用的过滤器从 MongoDB 中检索多个文档,并在日志集合中插入一条记录。

Test.findOrders = function (amount, callback) {

  // Finding objects from database
  Test.find(/** filters - Optional **/ { where: {}, limit: 10, fields: [], include: [], order: "", skip : 1}, function(err, data) {

    console.log(data);

    // Adding logs to the logs collection
    Test.app.models.Log.insert({ message: "orders finded", /*data to insert*/}, function(err, logData) {
      callback(data);
    });
  });
};

这里的过滤器是完全可选的。 where用于指定where条件,可以使用它的sub-filters(如gtltnin等)得到更多的condition-specific 记录。 fields 可用于 select 集合中的特定列,include 可用于根据关系连接不同的集合。其余的过滤器可以从它们的名字中理解。有关过滤器的更多信息,您可以查看link提到的here

持久化模型中也有很多有用的方法,可用于在不同情况下执行读取操作,如findfindOne

更新操作

下面的示例将更新 MongoDB 中的文档,并在日志集合中插入一条记录。

Test.updateOrder = function (amount, callback) {

      // Updating object into database
      Test.updateAttribute(/* where filter */{id: 1}, {amount: 10, /*data to update*/}, function(err, data) {

        // Adding logs to the logs collection
        Test.app.models.Log.insert({ message: "order updated", /*data to insert*/}, function(err, data) {
          callback(null);
        });
      });
    };

您可以对where过滤器的每个子过滤器执行更新操作。同样,持久模型中有许多方便的方法可用,可用于多种不同的场景(如 updateAttributeupdateAttributescreateUpdatesbulkUpdate 等)。

删除操作

下面的示例将从 MongoDB 中删除一个文档,并在日志集合中插入一条记录。

Test.deleteOrder = function (amount, callback) {

      // Deleting object from database
      Test.destroyById(123, function(err, data) {

        // Adding logs to the logs collection
        Test.app.models.Log.insert({ message: "order deleted", /*data to insert*/}, function(err, logData) {
          callback(data);
        });
      });
    };

Persistent Model还包含了不同类型的方法来根据不同的场景(如destroyAlldestroyById)执行删除操作。

关于 CRUD 操作的官方文档 您还可以从 below-mentioned URL 找到有关 loopback 中 CRUD 操作的完整文档:

下面link包含持久模型的所有可用方法,可用于应用多个 BL,

上述link.

也有几种方法可用于执行批量操作

日志记录

已经有几个可用的扩展,可以很容易地与环回连接以执行日志记录操作,下面列出了其中的一些:

  • loopback-component-logger (link),

这对于在控制台或数据库中记录操作很有用。