php mongodb 只插入唯一值?

标签 php mysql mongodb

在 mysql 中,我可以为我的表列设置唯一性,这样如果该值已经存在,用户就不会插入相同的值,

CREATE TABLE IF NOT EXISTS `user` (
  `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `screen_name` varchar(255) DEFAULT NULL,
  `user_name` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `secret` varchar(255) NOT NULL,
  `salt` varchar(255) NOT NULL,
  `signature` varchar(255) NOT NULL,
  `visited_on` timestamp NOT NULL,
  PRIMARY KEY (`user_id`,`person_id`,`category_id`),
  UNIQUE KEY `user_name_UNIQUE` (`user_name`),
  UNIQUE KEY `salt_UNIQUE` (`salt`),
  UNIQUE KEY `signature_UNIQUE` (`signature`),
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

在 MongoDB 中呢?我怎样才能做到这一点?

$document = array(
    "title" => "Mr",
    "fullname" => "John C",
    "username" => "user1",
    "age" => 20
);
$collection->insert($document);

如果我再次运行,用户名为“user1”的用户会重复出现。使用 MySQL,它不会发生,我会得到一个错误。但是,如果“user1”已经存在,我如何让 Mongo 抛出错误?

最佳答案

您的 SQL 表声明还在“user_name”字段上声明了“唯一”索引。因此你想在 MongoDB 中做同样的事情,通过添加索引:

在 shell 中:

db.collection.createIndex({ "username": 1 },{ "unique": true })

或者在 PHP 代码中使用相同的 method :

$collection->createIndex(
    array( "username", 1 ),
    array( "unique", true )
)

然后,如果您尝试插入违反该约束的内容,那么您将收到一个异常。

如果您不想在每次插入操作时都收到异常,那么您可以使用 "upsert" MongoDB 的功能以及 $setOnInsert更新修饰符:

$document = array(
    "title" => "Mr",
    "fullname" => "John C",
    "username" => "user1",
    "age" => 20
);

$collection->update(
    array("username", $document["username"]),
    array('$setOnInsert',document),
    array("upsert", true)
)

这只会在创建新文档时进行更改,而不会修改已存在的查询字段值。

使用“upserts”当然会带来“查找”集合中数据的成本,但也可以与您确实打算修改匹配文档的数据的操作相结合。

关于php mongodb 只插入唯一值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31601542/

相关文章:

php - 修复错误后内部服务器错误仍然存​​在,但新的相同文件成功?

php - 如何从 MySQL 时间戳数据类型的日期中减去一天?

MySQL:建表时 "KEY"代表什么?

mysql - 在 mysql 中为 count() 显示特定字符​​并显示它

javascript - Mongoose 搜索查询

Mongodb稀疏索引和普通索引

php - 使用 Ajax 验证动态下拉列表

php - 从 PHP 服务器执行 hadoop jar 失败。没有权限

node.js - 无法读取未定义的属性 'newPost'

php - 尝试对整个数据库实现加密