添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

MongoDB中的对象-文档映射

MongoDB用类似于JSON格式来保存数据, 并将数据保存为一个文档. 在编程语言中, 和文档对象相关的功能被称之为 对象-文档映射(O/D 映射) .

像在 O/R 映射 中描述的一样, 在O/D 映射中这里的一个文档也与一个对象相关.

因为MongoDB文档是类似JSON格式的, JSON可能有层级结构, 但是在O/D 映射中, 一个对象不会对应文档的两层或者更多的层级. 例如, 下面的例子显示了O/D 映射中唯一支持的简单形式:

"name" : "John Smith" , "age" : 20 , "email" : "[email protected]"

如果你完全不知道如何正确设置MongoDB连接, 请参考 访问MongoDB 章节.

要生成O/D 映射的类, 在应用程序的根目录下执行下面的命令. 在这个例子中, 我们建立一个叫 foo 的集合. 模型(model)的名字将会是 Foo .

$ tspawn mm  foo
  created   models/mongoobjects/fooobject.h
  created   models/foo.h
  created   models/foo.cpp
  updated models/ models. pro

下一步是定义将要存储在文档中的数据. 我们编辑C++头文件models/mongoobjects/fooobject.h, 增加字符串变量titelbody.

class T_MODEL_EXPORT FooObject : public TMongoObject, public QSharedData
  public:
    QString title;     // 加在这里
    QString body;      // 加在这里
    QString _id;
    QDateTime createdAt;
    QDateTime updatedAt;
    int lockRevision;
    enum PropertyIndex {
          Id = 0,
          CreatedAt,
          UpdatedAt,
          LockRevision,

除了_id以外的变量都不是必须的, 所以你可以删除它们.变量_id等效于MongoDB中的ObjectID, 所以不要删除它.

  • 这个对象负责访问MongoDB, 这也是为什么我们称之为”Mongo对象”.
  • 再次执行下面的命令将增加的内容反射到其他文件.

    $ tspawn mm foo
    

    键入’Y’更改所有文件.
    它完成了模型(model)的CRUD.

    如果想生成的骨架中包含控制器(controllers)和*视图(views), 可以执行下面的命令代替’tspawn mm foo’.

    $ tspawn ms foo
    

    现在, 骨架已经生成. 编译后, 试试在应用服务器(AP)中运行.

    $ treefrog -d -e dev
    

    在浏览器中访问http://localhost:8800/foo/, 包含列表的一个界面将显示. 使用这个界面作为新建, 编辑和删除的入口.

    如你所见, 这个文件非常类似迁移文件(Rails中), 因为你通过编辑Mongo对象的类自动定义/更改了Mongo文档的布局.

    读取Mongo对象

    让我们看看骨架生成的Mongo对象类如何被读取. 我们通过使用对象ID作为关键字加载Mongo对象.

    QString id;
    id = ...
    TMongoODMapper<FooObject> mapper;
    FooObject foo = mapper.findByObjectId(id));
    

    创建Mongo对象

    和普通对象创建的方式一样, 通过设置对象属性创建它. 完成以后, 调用create()方法将会在MongoDB中创建一个新的文档.

    FooObject foo;
    foo.title = ...
    foo.body = ...
    foo.create();
    

    因为对象ID是自动创建的, 请不要设置它.

    更新Mongo对象

    通过对象ID获取Mongo对象, 并设置新值. 完成以后, 调用update()方法将在MongoDB内容更新对象.

    TMongoODMapper<FooObject> mapper;
    FooObject foo = mapper.findByObjectId(id));
    foo.title = ...
    foo.update();
    

    保存文档还有一个save()方法.
    如果在MongoDB中相关的文档不存在它会调用create()方法, 如果文档存在则调用update()方法.

    删除Mongo对象

    删除Mongo对象会删除文档. 使用remove()方法删除对象.

    TMongoODMapper<FooObject> mapper;
    FooObject foo = mapper.findByObjectId(id));
    foo.remove();
    

    如上所述, 可以像使用ORM对象(O/R 映射对象)一样使用Mongo对象. 从控制器(controller)的角度看, 因为模型(model)提供的功能是一样的, 它们的使用没有不同的地方. 这些对象被隐藏在模型(model)中的’private’代码块.

    换句话说, 如果你不重叠地定义模型类(model class), 甚至可以同时访问MongoDB和关系型数据库, 这样可以让你非常容易的件数据保存在不同的数据库系统上.如果能正确的实现它, 你可以减少有时导致系统瓶颈的关系型数据库的负债.
    然而, 在发布时, 你需要考虑是否数据的性质是否可以保存在关系型数据库或保存在MongoDB中. 也许, 这个问题是你是否希望使用会话?

    这样, 你可以很容易地使用不同的机制访问数据库, 这些机制能让你创建一个可扩展可伸缩的网页应用系统.

    ** Mongo对象类和ORM对象类的区别**

    在Mongo对象类中, 你可以像下面的代码显示的那样定义QstringList作为实例变量:

    class T_MODEL_EXPORT FooObject : public TMongoObject, public QSharedData
      public:
        QString _id;
        QStringList  texts;
      
  • 请留意: QstringList不能被在ORM对象类中定义.
  •