固定值字段的猫鼬复合指数

时间:2015-11-06 14:44:34

标签: mongodb mongoose

是否可以制作复合索引,其中一个字段具有固定值?

假设我想避免用户针对不同的帐户使用相同的电子邮件,但仅针对常规用户帐户,我希望允许管理员在他们想要的任意数量的地方使用邮件,甚至定期使用用户帐户和使用相同电子邮件的管理帐户

User.index({ username: 1, email: 1 }, { unique: true })

没用,因为它不允许管理员重复使用该电子邮件。是否可以做类似的事情?

User.index({ role: "regular_user", username 1, email: 1}, { unique: true });

2 个答案:

答案 0 :(得分:2)

路易斯,

关于你给出的例子。如果创建唯一的复合索引,则各个键可以具有相同的值,但索引条目中存在的键之间的值组合只能出现一次。因此,如果我们在{"username" : 1, "role" : 1}上有唯一索引。以下插入是合法的:

> db.users.insert({"username" : "Luis Sieira"})
> db.users.insert({"username" : "Luis Sieira", "role" : "regular"})
> db.users.insert({"username" : "Luis Sieira", "role" : "admin"})

如果您尝试插入上述任何文档的第二个副本,则会导致重复的密钥异常。

您的情景

我认为如果您在架构中添加了allowance字段。为新帐户执行管理员插入时。您可以为其管理员津贴添加不同的值。如果您为{"username":1,"email":1, "allowance" : 1}

添加了唯一索引

您可以合法地进行以下插入:

>db.users.insert({"username" : "inspired","email": "i@so.com", "allowance": 0})
>db.users.insert({"username" : "inspired","email": "i@so.com", "allowance": 1})
>db.users.insert({"username" : "inspired","email": "i@so.com", "allowance": 2})
>db.users.insert({"username" : "inspired","email": "i@so.com", "allowance": 3})

当然,您必须从客户端处理某些逻辑,但这样您就可以为0帐户使用regular的限额代码,然后允许您保存每当admin创建另一个帐户时,更高的限额代码(递增它或为其添加自定义值)。

我希望这为使用独特的复合索引提供了一些方向。

答案 1 :(得分:1)

你走在正确的轨道上。首先,如果您使用var oData = { root: ...} // code for image 2 jQuery.getJSON(url, function (result) { createTable(oData['table1'], 'table1') createTable(oData['table2'], 'table2') }) // code for image 1 createTable(oData['table1'], 'table1') createTable(oData['table2'], 'table2') function createTable(oData, codeSample){ var oTable = new sap.ui.table.TreeTable({ columns: [ new sap.ui.table.Column({label: "trans_class", template: "trans_class"}) , new sap.ui.table.Column({label: "Checked", template: "checked"}) ], height: '100%', selectionMode: sap.ui.table.SelectionMode.None, enableColumnReordering: false, expandFirstLevel: false, visibleRowCount : INITIAL_ROW_COUNT_IN_TABLE, visibleRowCountMode : sap.ui.table.VisibleRowCountMode.Auto, toggleOpenState: function(oEvent) { var isLeafExpanded = oEvent.getParameter("expanded"); if(isLeafExpanded){ oTable.setVisibleRowCount(oTable.getVisibleRowCount() + 2) SUM_INDEX_TOGGLE = SUM_INDEX_TOGGLE + 2 }else{ oTable.setVisibleRowCount(oTable.getVisibleRowCount() - 2) SUM_INDEX_TOGGLE = SUM_INDEX_TOGGLE - 2 } } }) var oModel = new sap.ui.model.json.JSONModel(); oModel.setData(oData); oTable.setModel(oModel); sap.ui.getCore().setModel(oModel, codeSample); oTable.bindRows("/root"); oTable.expand(4); // expand Sum Row //Bring the table onto the UI oTable.placeAt(codeSample); 这样定义索引

role

Mongo会将User.index({role: 1, username: 1, email: 1}, { unique: true }); 用于未指定null字段的文档。如果在未指定role的情况下插入用户并尝试再次添加,则会出现错误,因为数据库中已存在三个字段。因此,您可以通过不包含角色来使用此优势(或者您可以使用预定义的值来获得更好的阅读,就像您提议的那样role)。

现在,棘手的部分是强制索引允许管理员regular_user唯一性约束。最好的解决方案是生成一些哈希并将其添加到角色中。因此,如果您只是添加具有bypass等角色的管理员,则不会绕过约束。同时,使用admin_user之类的角色(总是带有不同的后缀)将允许您多次插入相同的管理员。