我在SQL中有3个具有多对多关系的表。第一个表“account”有3个字段(AccountId,UserName,Email)。第二个表“device”有2个字段(DeviceId和DeviceCode)和表“关联”有4个字段(AccountId,DeviceId,LastActivityDate,HasException)
如何将它们转换为mongoDB。 根据mongodb.org的建议,我将集合“Associaton”嵌入到设备集合和帐户集合中,但每当我的系统有新事务时,字段“LastAccessDate”总是被更新。
-Account collection: {
“UserName”:“xxx”, “电子邮件”:1,
“协会”:[{ “DeviceId”:“4f45c4b73174ec818148d5c5”, “LastActivityDate”:“星期四,2012年2月23日11:44:19 GMT +07:00”, “HasException”:false },{ “DeviceId”:ObjectId(“4f45c5e93174ec818148d5c7”), “LastActivityDate”:“星期四,2012年2月23日11:52:05 GMT +07:00”, “例外”:null }] }
设备集合: {
“DeviceCode”:“abcjxhcbxkjcnxkcjhdiofjdojdlkdknd”, “协会”:[{ “AccountId”:“34fdgfdy5676”, “LastActivityDate”:“02/03/2012”, “HasException”:false },{ “AccountId”:“34fdgfdy5dd676”, “LastActivityDate”:“02/03/2012”, “HasException”:是的 }],
}
答案 0 :(得分:2)
我为您的问题找到了多种解决方案:
为避免连接,必须在NoSQL数据库中进行客户端连接,将所有内容放入一个集合中。如果你不经常更新,你可以做
{
_id,
LastAccessDate,
HasException,
Account : {
AccountID,
UserName,
Email },
Device : {
DeviceID,
DeviceCode }
}
这导致重复数据,但如果性能(无连接)出现在内存效率之前,它可能是适合您的解决方案。由于数据存储多次,因此对服务器的更新要求更高。即更新电子邮件地址看起来像
db.myColl.update({"Account.UserName" : "User ToUpdate"}, {"$set" : {"Account.Email" : "new@email.com"} });
由于您不再需要AccountID和DeviceID加入,您也可以删除这两个字段。
如果您经常更新,而不是嵌入,则可以使用引用。我认为你必须在客户端解决它们。然后你有三个集合:
帐户:强>
{
_id,
UserName,
Email
}
设备:强>
{
_id,
DeviceCode
}
<强>协会强>
{
_id,
account : {
"$ref" : "Account",
"$id" : ... }
device : {
"$ref" : "Device",
"$id" : ... }
}
这种方式没有任何重复,但您必须处理引用。