我需要强制 Mongo 数据库集合中文档的唯一性。
我的文档有一个“id”字段和一个“name”字段,以及其他几个字段。 “id”字段不是唯一的。
我的要求是“名称”在不同的“id”值中应该是唯一的。但是,可以有多个具有相同“id”和相同“名称”的文档。 (同一个“id”中可以有多个“name”)。
例如:
允许使用以下文件(相同 ID、相同/不同名称):
{ "id" : "1", "name": "Alice", ...}
{ "id" : "1", "name": "Bob", ...}
{ "id" : "1", "name": "Alice", ...}
但是不允许以下内容(相同名称,不同 ID):
{ "id" : "1", "name": "Alice", ...}
{ "id" : "2", "name": "Alice", ...}
是否有可能在数据库本身而不是应用程序逻辑中强制执行此操作?
我认为仅通过数据库手段无法用现有数据“执行”该规则。如果您有违反规则的数据,您可能需要进行一次性清理。但是,对于新插入的文档,您可以在聚合中执行以下操作并将它们合并到集合中。
$unionWith
您要插入的新文档(将它们放入$documents
$setWindowFields
计算分区 $denseRank
内的 name
并按 id
的顺序
$match
仅选择排名为 1 的文档$unset
排名字段$merge
进入收藏db.collection.aggregate([
{
"$unionWith": {
"coll": "collection",
"pipeline": [
{
"$documents": [
// documents to be inserted here
{
"id": "1",
"name": "Alice"
}
]
}
]
}
},
{
"$setWindowFields": {
"partitionBy": "$name",
"sortBy": {
"id": 1
},
"output": {
"idRankInName": {
"$denseRank": {}
}
}
}
},
{
"$match": {
"idRankInName": 1
}
},
{
"$unset": "idRankInName"
},
{
"$merge": {
"into": "collection"
}
}
])