如何使用MongoDB维护文档之间的完整性?

如何使用MongoDB维护文档之间的完整性?,mongodb,Mongodb,我正在编写一个应用程序,我想使用MongoDB。过去我一直使用关系数据库。 我不明白我怎样才能保持正直。我用一个例子更好地解释我: 我有“餐厅”、“菜肴”和“配料”。如果我在MongoDB中为一道菜创建了一个文档,它包含许多配料(对象“配料”数组)。我还有一个集所有成分 如果我更改了配料的名称,如何将配料的名称更新为“dish”文档?您的描述听起来像是一个人工示例,因此很难正确回答,但我现在将坚持使用它 在你的例子中,问问自己你是否真的需要独特的成分。用户将如何添加一个新的?他或她是否需要先搜索

我正在编写一个应用程序,我想使用MongoDB。过去我一直使用关系数据库。 我不明白我怎样才能保持正直。我用一个例子更好地解释我:

我有“餐厅”、“菜肴”和“配料”。如果我在MongoDB中为一道菜创建了一个文档,它包含许多配料(对象“配料”数组)。我还有一个集所有成分


如果我更改了配料的名称,如何将配料的名称更新为“dish”文档?

您的描述听起来像是一个人工示例,因此很难正确回答,但我现在将坚持使用它

在你的例子中,问问自己你是否真的需要独特的成分。用户将如何添加一个新的?他或她是否需要先搜索配料集合?数据库中是否有两个或三个甜椒实例,这真的会产生影响吗?那么限定词呢(比如“猪里脊”、“爪哇香草”或“英国切达干酪”)。它的可用性如何

NoSQL方法将是

啊,见鬼!让我们建议其他用户之前输入的成分。如果用户选择了一个,就可以了。否则,即使每道菜都有自己的配料表,也没关系。最多会累积到几兆

因此,您将彻底抛弃配料系列,推出一种新的模型:

{
_id:someObjectId,
名称:“萨厄布拉顿”,
成分:[
{名称:“牛肉尾盖”,数量:“1公斤”},
{名称:“甜菜糖浆”,数量:“100ml”},
{名称:“(红)葡萄酒醋”,数量:“100毫升”}
{名称:“洋葱”,数量:“2大”},
{名称:“胡萝卜”,数量:“2中等”}
//等等
]
}
因此,您不再需要引用完整性。用户有权对配料进行鉴定。现在,您将如何创建成分建议?非常简单:偶尔运行一次聚合

db.disks.aggregate([
{“$unwind”:“$Components”},
{“$group”:{“\u id”:“$配料.名称”,“菜肴”:{“$addToSet”:“$\u id”}},
{“$out”:“配料”}
])
生成一个名为“配料”的集合,默认情况下,配料的名称被编入索引(因为它们是
\u id
)。因此,如果用户输入新的配料,您可以建议自动完成。如果用户输入“beef”,您的查询将如下所示:

db.components.find({“\u id”:/beef/i})
哪个应该返回

{u id:“牛肉尾盖”,“菜肴”:[someObjectId]}
因此,在没有引用完整性的情况下,您可以使应用程序更易于使用、维护,甚至可以免费添加一些功能