mongodb userid表单数据链接/嵌入在不同的集合中

时间:2014-06-03 09:28:48

标签: php mongodb collections embed database

我正在研究mongodb,我想知道是否可以将一些数据链接到不同mongodb集合中的用户ID?

当我提交表单时,每个表单都有一个不同的连续用户ID。不一样

到目前为止我的编码是:

<?php 

$content['_id'] = new MongoId();
$m = new Mongo();

$db = $m->learning;

    $users = $db->users;
    $products = $db->products;

if ( isset($_POST['name'])) {
    $users->insert( array(
            "_id" => $content['_id']
    "name" => $_POST['name'],
    "city" => $_POST['city'],
    ));
    }

if ( isset($_POST['car'])) {
    $products->insert( array(
    "_id" => $content['_id'],
    "car name" => $_POST['car'],
    ));
    }
从我的角度来看,我认为,编码很好。任何人都可以指出编码有什么问题,以实现我想要做的事情:将数据链接到不同集合中的特定用户ID?

非常感谢。

1 个答案:

答案 0 :(得分:0)

在我看来,您的架构设计就像放在面向文档的数据库上的关系架构一样。

要回答你的问题,做这样的事情是完全可以的

{ "_id": <someOid>,
  "name": "Bob",
  "city": "DaCity",
  "car" : <oIdOfACar>
}

但是,由于mongoLand中没有连接,这意味着您必须进行两次查询才能获得有关Bob及其汽车的所有信息。这种方法具有最小化冗余的优点。

根据您的应用程序的所有内容,您可能希望采用一种称为嵌入的方法:

{ "_id": <someOid>,
  "name": "Bob",
  "city": "DaCity",
  "car" : {"name":"De Lorean", "model":"DMC-12"}
}

具有冗余,但这可能是一个优势,例如,当您的汽车收藏仅包括较新的模型或某些模型可能会随着时间的推移被删除。然后,您仍然可以访问用户汽车,尽管它不再在汽车收藏中。因此,您可以使用汽车收藏(或类似carqueryapi.com)来提供有效的输入数据,并将您的用户保存为完整的非链接文档。如果您想了解有多少用户驾驶De Lorean DMC-12,您可以使用mongo shell语法进行查询,例如

 db.users.find({"car.name":"De Lorean","car.model":"DMC-12"}).count()

甚至用

查询实际用户
 db.users.find({"cars": { $elemMatch :{ "name":"De Lorean","model":"DMC-12"}}})

如果用户可以拥有多辆汽车并将其保存为名为cars的数组。

另外,每次要从用户文档访问汽车时都不必查询汽车。甚至可以进行一些分析:

db.users.find({"car.name":"Toyota"}).count()

但正如我所说:如何设计你的架构在很大程度上取决于你的应用程序应该做什么。

一般情况下,您可能需要深入了解mongoDB's docs about data modelling