我有这个SQL数据库结构。用户表、对象表格和映射表users_objects_map将对象分配给用户帐户。
在SQL中,它运行良好。使用这种结构,可以很容易地获取分配给对象的一个或多个用户的对象。我还可以将一个对象分配给多个用户。
用户id名字姓。。。对象id。。。用户对象映射user_id对象id
使用MongoDB构建此数据库的最佳方法是什么?
我的第一个想法是向用户添加一个数组,其中将存储assign对象的所有ID。
{"名字":"John","姓氏":"Doe","object_ids":["id","id2",…,"id-n"]}
但是,如果一个用户被分配到数千个对象,那会是什么呢?我认为这不是一个好的解决方案。如何获取分配给对象的所有用户或分配给用户的所有对象?
有什么聪明的MongoDB解决方案可以解决我的问题吗?
使用BsonArrays中的对象id作为对对象的引用是一种很好的方法,还可以考虑在用户本身的"object_id"中使用BsonDocuments,然后您将能够更容易地扩展它,并使用"_id"(ObjectID)使MongoDB对这些id进行索引,这将获得性能。
最终,您将拥有两个集合,一个是用户集合,另一个是对象集合:
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的驱动程序。
示例:给我所有拥有object 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();
我希望我在这方面帮助过你。
祝你好运!