我有这个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解决方案?
答案 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();
我希望我以这种方式帮助过你。
祝你好运!