gpt4 book ai didi

php - MongoDB,在集合之间使用 Mongodb ObjectID

转载 作者:可可西里 更新时间:2023-11-01 09:09:05 31 4
gpt4 key购买 nike

使用 PHP 和 MongoDB,我在同一数据库中有一个名为用户的集合和另一个名为表单的集合。

我使用 Mongodb ObjectID 作为表单集合中文档的用户标识符,将用户 ObjectId 保存为每个表单文档上的 uid。

我要在表单集合中创建 uid 字段的索引,但我的问题是我应该如何保存用户的 Objectid?

截至目前,我将其保存为普通字符串(简化)

$collection->insert( array('formName'=>'The name','uid'=>'CURRENT_USERS_ObjectId_AS_string') );

在这种情况下,为 uid 创建一个 Mongodb ObjectID,这看起来合乎逻辑还是最佳实践

$collection->insert( array('formName'=>'The name','uid'=> new MongoId('CURRENT_USERS_ObjectId_AS_string')) );

最佳答案

manual references的使用非常好 - 甚至推荐。仅使用 DbRefs如果它们提供特定的好处 - 例如允许自动取消引用(mongo 脚本或 php 代码可以自动知道 foo 指向集合 x,id y [在数据库 z])。

不同的类型是一个糟糕的设计

但是要避免打字。

在一个集合中拥有实际上是外键的东西,并且它与它所指向的集合的类型不同,这是一种糟糕的设计。类型杂耍通常是要从开发中消除的东西,而不是引入。

想想数据库

像这样在数据库上运行的代码应该可以工作:

form = db.forms.findOne();
user = db.users.findOne({_id: form.user_id});

并且用户集合 _id 字段的类型无关紧要。使用问题中的架构,此代码变为:

form = db.forms.findOne();
user = db.users.findOne({_id: new MongoId(form.user_id)});

就其本身而言,这并没有太大区别,但这意味着您必须考虑/记住转换这些引用,如果/当创建使用不同类型的集合时就会出现问题 - 它会引入不一致。

考虑以下几点:

> school = db.schools.insert({_id: 123, name: "my school"});
> userId = new ObjectId();
> db.users.insert({_id: userId, name: "Me"});
> db.forms.insert({user_id: userId, school_id: 123});

假设学校 ID 是一个唯一代码。如果它不可能改变 - 用作 _id 字段是合适的并且是个好主意。现在,学校 id 和用户 id 是不同的类型:

> db.forms.findOne();
{
"_id" : ObjectId("508940370392baf87e68e31d"),
"user_id" : ObjectId("5089401c0392baf87e68e31b"),
"school_id" : 123
}

如果它们按原样存储,仍然有可能在查询中完全忽略这些不同的类型:

form = db.forms.findOne();
school = db.schools.findOne({_id: form.school_id});
user = db.users.findOne({_id: form.user_id});

如果使用不同类型,这意味着有必要考虑“对于这个集合,我需要将字符串转换为 ObjectId,但对于这个,我必须不是”。

这是一个本可以避免的问题,但它却出现了。

关于php - MongoDB,在集合之间使用 Mongodb ObjectID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13068533/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com