Flutter MongoDB服务插件pip_services3_mongodb的使用

Flutter MongoDB服务插件pip_services3_mongodb的使用

本模块是PipServices多语言微服务工具包的一部分。它提供了实现MongoDB持久化的组件。

该模块包含以下包:

  • Build - 工厂用于创建MongoDB持久化组件。
  • Connect - 连接组件用于配置MongoDB数据库连接。
  • Persistence - 抽象持久化组件以执行基本的CRUD操作。

使用

在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  pip_services3_mongodb: version

然后从命令行安装包:

pub get

作为示例,我们创建一个针对以下数据对象的持久化层。

import 'package:pip_services3_commons/src/data/IIdentifiable.dart';

class MyObject implements IIdentifiable<String> {
  String id;
  String key;
  int value;
}

持久化组件应该实现以下接口,其中包含一组基本的CRUD操作。

abstract class IMyPersistence {
    void getPageByFilter(String correlationId, FilterParams filter, PagingParams paging);
    
    getOneById(String correlationId, String id);
    
    getOneByKey(String correlationId, String key);
    
    create(String correlationId, MyObject item);
    
    update(String correlationId, MyObject item);
    
    deleteById(String correlationId, String id);
}

为了实现MongoDB持久化组件,你需要继承IdentifiableMongoDbPersistence类。大多数CRUD操作将来自基类。你只需要覆盖getPageByFilter方法,并自定义过滤函数。还需要实现一个在基类中不存在的getOneByKey自定义持久化方法。

import 'package:pip_services3_commons/src/data/FilterParams.dart';
import 'package:pip_services3_commons/src/data/PagingParams.dart';
import 'package:pip_services3_mongodb/src/persistence/IdentifiableMongoDbPersistence.dart';

class MyMongoDbPersistence extends IdentifiableMongoDbPersistence<MyObject, String> {
  MyMongoDbPersistence() : super("myobjects") {
    this.ensureIndex({"key": 1}, {"unique": true});
  }

  composeFilter(FilterParams filter) {
    filter = filter != null ? filter : new FilterParams();
    
    List criteria = [];

    String id = filter.getAsNullableString('id');
    if (id != null)
        criteria.add({"_id": id });

    String tempIds = filter.getAsNullableString("ids");
    if (tempIds != null) {
        List ids = tempIds.split(",");
        criteria.add({"_id": {"\$in": ids }});
    }

    String key = filter.getAsNullableString("key");
    if (key != null)
        criteria.add({"key": key});

    return criteria.length > 0 ? {"\$and": criteria} : null;
  }
  
  Future<DataPage<MyObject>> getPageByFilter(String correlationId, FilterParams filter, PagingParams paging) async {
    return super.getPageByFilterEx(correlationId, composeFilter(filter), paging, null);
  } 

  getOneByKey(String correlationId, String key) async {
    Map<String, String> filter = {"key": key};

    Map<String, dynamic> item = await this.collection.findOne(filter);

    if (item == null)
      this.logger.trace(correlationId, "Nothing found from %s with key = %s", [this.collectionName, key]);
    else
      this.logger.trace(correlationId, "Retrieved from %s with key = %s", [this.collectionName, key]);

    item = this.convertToPublic(item);
    return item;
  }
}

你的微服务配置可能看起来像这样:

...
{{#if MONGODB_ENABLED}}
- descriptor: pip-services:connection:mongodb:con1:1.0
  connection:
    uri: {{{MONGO_SERVICE_URI}}}
    host: {{{MONGO_SERVICE_HOST}}}{{#unless MONGO_SERVICE_HOST}}localhost{{/unless}}
    port: {{MONGO_SERVICE_PORT}}{{#unless MONGO_SERVICE_PORT}}27017{{/unless}}
    database: {{MONGO_DB}}{{#unless MONGO_DB}}app{{/unless}}
  credential:
    username: {{MONGO_USER}}
    password: {{MONGO_PASS}}
    
- descriptor: myservice:persistence:mongodb:default:1.0
  dependencies:
    connection: pip-services:connection:mongodb:con1:1.0
  collection: {{MONGO_COLLECTION}}{{#unless MONGO_COLLECTION}}myobjects{{/unless}}
{{/if}}
...

更多关于Flutter MongoDB服务插件pip_services3_mongodb的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter MongoDB服务插件pip_services3_mongodb的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个使用Flutter与MongoDB服务插件pip_services3_mongodb的示例代码。这个示例展示了如何设置一个简单的Flutter应用,并通过pip_services3_mongodb插件连接到MongoDB数据库,执行基本的CRUD(创建、读取、更新、删除)操作。

首先,确保你已经在你的Flutter项目中添加了pip_services3_mongodb依赖。由于pip_services3_mongodb是一个Dart包,你可能需要在pubspec.yaml文件中添加相应的依赖(注意:这个包名可能是一个假设,因为实际的Flutter插件可能会有所不同,你可能需要查找具体的MongoDB插件)。这里假设有一个合适的插件可用:

dependencies:
  flutter:
    sdk: flutter
  pip_services3_mongodb: ^x.y.z  # 替换为实际的版本号

然后运行flutter pub get来获取依赖。

接下来是一个示例代码,展示了如何使用这个插件:

import 'package:flutter/material.dart';
import 'package:pip_services3_mongodb/pip_services3_mongodb.dart'; // 假设的包导入路径

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late MongoDbConnection connection;
  late MongoDbClient client;

  @override
  void initState() {
    super.initState();
    // 配置MongoDB连接
    var config = ConfigParams.fromTuples([
      'connection.uri', 'mongodb://localhost:27017/testdb', // MongoDB URI
      'db', 'testdb', // 数据库名称
      'collection', 'testcollection', // 集合名称
    ]);

    // 创建连接和客户端
    connection = MongoDbConnection();
    connection.configure(config);

    client = MongoDbClient();
    client.setReferences(References.fromTuples([
      Descriptor('pip-services3-mongodb', 'connection', 'mongodb', 'default', '1.0'), connection,
    ]));

    // 打开连接(在实际应用中,你可能需要在适当的生命周期方法中管理连接的打开和关闭)
    connection.open(null).then((_) {
      print('MongoDB connection opened');
    }).catchError((error) {
      print('Failed to open MongoDB connection: $error');
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter MongoDB Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 示例:插入文档
              var document = {
                'name': 'John Doe',
                'age': 30,
              };

              var result = await client.create(null, document);
              print('Inserted document ID: ${result['id']}');

              // 示例:读取文档
              var items = await client.getPageByFilter(null, FilterParams.fromTuples([], []), null);
              print('Retrieved documents: $items');

              // 示例:更新文档
              var update = {
                '$set': {'age': 31},
              };
              await client.updateById(null, result['id'].toString(), update);
              print('Updated document');

              // 示例:删除文档
              await client.deleteById(null, result['id'].toString());
              print('Deleted document');
            },
            child: Text('Perform MongoDB Operations'),
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    // 关闭连接
    connection.close(null);
    super.dispose();
  }
}

注意

  1. 上面的代码是一个简化的示例,用于展示如何设置和使用MongoDB插件。在实际应用中,你需要更细致地管理数据库连接的生命周期,例如,在适当的生命周期方法中打开和关闭连接。
  2. pip_services3_mongodb这个包名是一个假设,Flutter社区可能有其他用于MongoDB的插件。你需要根据实际的插件文档进行调整。
  3. 示例中的MongoDbClient类及其方法(如creategetPageByFilterupdateByIddeleteById)也是假设的,你需要根据实际的插件API进行调整。

希望这个示例能帮助你开始使用Flutter与MongoDB服务插件。

回到顶部