对象映射解决方案

时间:2012-02-26 12:06:58

标签: object mongodb

我有这个SQL数据库结构。 用户表,对象表和映射表 users_objects_map ,用于将对象分配给用户帐户。

在SQL中它工作正常。利用这种结构,很容易获取用户的对象或分配给对象的用户。我也可以为多个用户分配一个对象。

users
id
firstname
lastname
...

objects
id
...

users_objects_map
user_id
object_id

使用MongoDB构建它的最佳方法是什么?

我的第一个想法是向用户添加一个数组,其中将存储所有分配对象的ID。

{"firstname":"John", "lastname": "Doe", "object_ids":["id","id2",...,"id-n"]}

但是,如果将用户分配给数千个对象,该怎么办?我认为这不是一个好的解决方案。以及我如何获取分配给对象的所有用户或分配给用户的所有对象?

我的问题是否有任何聪明的MongoDB解决方案?

1 个答案:

答案 0 :(得分:0)

使用BsonArrays中的对象ID作为对象的引用是一个很好的方法,并且还考虑在用户自己的“object_ids”中使用BsonDocuments,然后您将能够更容易地扩展它并使用“_id” (ObjectID)以便MongoDB索引这些ID,这将获得性能。

最终,您将拥有2个集合,一个是用户,另一个是对象:

user:
{
    "_id" : "user_id",
    "firstname" : "John",
    "lastname" : "Doe",
    "object_ids" : [
        { "_id" : "26548" , "futurefield" : "futurevalue" },
        { "_id" : "26564" , "futurefield" : "futurevalue" } 
    ]
}

此刻我真的不知道他们会成为什么样的物品......但我可以举个例子:

workshop object:
{
    "_id>" : "user_id",
    "name" : "C# for Advanced Users",
    "level" : "300",
    "location" : "Amsterdam, The Netherlands",
    "date" : "2013-05-08T15:00:00"
}

现在来了有趣的部分,那就是查询。 我正在使用C#开发并使用mongodb.org中的驱动程序。

实施例: 给我每个有对象id ==“26564”的人。

var query = from user in userCollection.Find(Query.EQ("objects_ids._id","26564"))
            select user;

此查询将返回文档,在这种情况下是与ID匹配的用户。 如果您有一系列值,请使用:Query.All(“name”,“BsonArray Values”);

第二个查询是查找和/或匹配BsonDocuments可能包含的对象ID的ID。

var secondQuery = 
  from workshops in objectsCollection.Find(Query.EQ("_id", "userid"))
  select cust["object_ids"].AsBsonArray.ToArray();

我希望我以这种方式帮助过你。

祝你好运!