我是NoSQL的新手,对不起,如果这是非常基本的话。假设我有以下集合:
{
a: 1,
b: 2,
c: 'x'
},
{
a: 1,
b: 2,
c: 'y'
},
{
a: 1,
b: 1,
c: 'y'
}
我想对匹配的任何内容运行“重复数据删除”查询:
{
a: 1,
b: 2
... (any other properties are ignored) ...
},
因此,在运行查询后,集合中剩余的任何一个都可以正常:
{
a: 1,
b: 2,
c: 'y'
},
{
a: 1,
b: 1,
c: 'y'
}
OR
{
a: 1,
b: 2,
c: 'x'
},
{
a: 1,
b: 1,
c: 'y'
}
只要只有一个文档的== 1且b == 2,
答案 0 :(得分:6)
如果您始终希望确保只有一个文档具有任何给定的a
,b
组合,则可以在a
和b
上使用唯一索引。创建索引时,您可以提供dropDups
选项,该选项将删除除一个副本之外的所有内容:
db.collection.ensureIndex({a: 1, b: 1}, {unique: true, dropDups: true})
答案 1 :(得分:0)
我不知道任何可以就地更新您的收藏的命令,但您当然可以通过临时存储来完成。
a
和b
)tmp
。弃掉小组的其他成员。tmp
。您可以使用MapReduce或即将发布的Aggregation Framework(目前处于不稳定的分支中)执行此操作。
我决定不在这里编写代码,因为它会带走远离你的快乐。 :)
答案 2 :(得分:0)
此答案已有一段时间没有更新。我花了一段时间才弄清楚这一点。首先,使用Mongo CLI,连接到数据库并在要唯一的字段上创建索引。这是users
具有唯一电子邮件地址的示例:
db.users.createIndex({ "email": 1 }, { unique: true })
1
会创建索引,并自动创建现有的_id
索引。
现在,当您在某个对象上运行create
或save
时,如果该电子邮件存在,Mongoose将遇到重复错误。