php mongodb只插入唯一值?

时间:2015-07-24 03:08:02

标签: 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抛出错误呢?已经存在?

2 个答案:

答案 0 :(得分:4)

您的SQL表声明还声明" unique" " user_name"的索引领域。因此,您希望在MongoDB中添加索引:

在shell中:

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

或者在具有相同method

的PHP代码中
$collection->createIndex(
    array( "username", 1 ),
    array( "unique", true )
)

然后,如果您尝试插入违反该约束的内容,则会收到异常。

如果您希望在每次插入操作时都不会收到异常,那么您可以使用MongoDB的"upsert"功能以及$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"当然会带来"查找"集合中的数据,但也可以与您打算修改文档匹配的数据的操作结合使用。

答案 1 :(得分:1)

来自mongodb doc

http://docs.mongodb.org/manual/tutorial/create-a-unique-index/

创建唯一索引¶

MongoDB允许您为索引指定唯一约束。这些约束阻止应用程序插入具有插入字段重复值的文档。

如果集合中已包含违反索引唯一约束的数据,则MongoDB无法在指定的索引字段上创建唯一索引。

单个字段上的唯一索引

要创建唯一索引,请考虑以下原型:

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