gpt4 book ai didi

mongodb - 在一个集合的所有文档中具有唯一值的数组

转载 作者:IT老高 更新时间:2023-10-28 13:12:06 26 4
gpt4 key购买 nike

情况:我有几个相同集合(帐户)的文档,每个文档都有一个名为 uniquestrings 的数组(字符串)类型的属性。

问题: uniquestrings 中的每个条目在 mongodb 中的所有文档中都必须是唯一的。似乎 MongoDB/Mongoose 不提供这样的验证(addToSet¹ 和 index: {unique: true}² 都没有解决问题)。是否有一种模式来重组我的文档模式以确保 mongodb 本身可以验证它?目前,软件本身会在更新文档之前对其进行检查。

例如

account {
_id: 111,
uniquestrings: ["a", "b", "c"]
}

account {
_id: 222,
uniquestrings: ["d", "e", "f"]
}

例如通过从 mongo 抛出重复错误来防止 account(222).uniquestrings.push("a");

¹数组中的唯一性是不够的
² 数组中的每个项目在集合中必须是唯一的

更新1:

更多示例。受影响的 Schema 条目如下所示:

var Account = new Schema({
...
uniquestrings: [{type: String, index: {unique: true}}]
...
});

现在创建 4 个帐户文件。我只希望 1 和 2 正常,休息应该失败。

var accountModel1 = new Account.Model({uniquestrings: ["a", "b"]});
accountModel1.save(); // OK
var accountModel2 = new Account.Model({uniquestrings: ["c", "d"]});
accountModel2.save(); // OK
var accountModel3 = new Account.Model({uniquestrings: ["c", "d"]});
accountModel3.save(); // FAIL => Not unique, so far so good
var accountModel4 = new Account.Model({uniquestrings: ["X", "d"]});
accountModel4.save(); // OK => But i Want this to faile because "d" is alreay in use.

最佳答案

如果您愿意将唯一值存储在不同的集合中,这可能是可能的。它的结构如下:

{ "uniquestring" : "a", "account" : 111 }
{ "uniquestring" : "b", "account" : 111 }
{ "uniquestring" : "c", "account" : 111 }
{ "uniquestring" : "d", "account" : 222 }
{ "uniquestring" : "e", "account" : 222 }
{ "uniquestring" : "f", "account" : 222 }

我不是 Mongoose 的专家,但我相信您可以定义模型以将集合链接在一起,此处的帐户字段引用帐户集合的 _id 字段。

现在,您可以使用简单的索引来强制唯一性:

db.uniquestrings.createIndex( { "uniquestring" : 1 } , { unique : true } )

现在,您的应用在保存数据时需要做更多工作(它需要保存到 uniquestrings 集合和 accounts 集合),但您现在可以在数据库级别强制执行这些数据的唯一性字符串,跨数据库。

欢迎任何对如何在 Mongoose 中实现和使用此类模型有更详细了解的人进行 PS 编辑。

关于mongodb - 在一个集合的所有文档中具有唯一值的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42982324/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com