MongoDB中如何不使用_id作为主键的简单策略

notonly 发布于 2015/01/28 17:11
阅读 22K+
收藏 0

解读下一代网络:算力网络正从理想照进现实!>>>

我在网上搜了很多,可能我的问题不好解决。

MongoDB倒是为我们提供了一个自动的主键功能,但是取个名字叫做_id,多个斜杠怎么看怎么不爽。不知道有没有提供一个机制可以把默认的_id改名为id之类的。

如果不能改,那么MongoDB有没有为用户提供新增一个主键的功能(这个可能真没有)

如果这个也没有,那我凑合着用用_id,这个也能接受。那么能不能将_id这个字段的数据类型改为string型的,因为客户端只认string型和int型,因为_id是ObjectId型,每次操作都要做来回做切换,很烦。这个是关键一点。

我想知道的是MongoDB内部机制的解决方案,我当然知道逻辑层可以控制这一切。

另外,如果MongoDB没有提供解决方案的话,那么PHP里面的MongoDB驱动的方法能改成自定义的吗?比如我很想将insert方法改为:

//用AOP或者元编程将Mongo驱动里的实现更改为下面的形式
function insert(json) {
    //调用Mongo的insert(json)
    newJson = json
    newJson._id = json._id.toString()
    mongo.update(['_id':json._id], newJson)
}
代码长的不大像PHP,见谅了,总之是这个意思就是了。


纯当学习了

加载中
0
m
magiclogy

关于把_id改成id这件事,有点难以想象。。。

对于新增一个主键,允许有两个主键,我觉得在逻辑上就不成立吧。。。

为什么你会认为_id必须是ObjectId型?看看官方文档里的例子:

http://docs.mongodb.org/manual/reference/method/db.collection.insert/#insert-a-document-specifying-an-id-field

_id可以在insert的时候,自行维护。

不过,用其他方式生成_id会比较蛋疼。。。一方面php并没有非常方便的单子化操作的工具,_id的生成必须要交给mongodb,另一方面,mongodb生成_id的方式非常适合集群,是类似生成UUID的方式,如果弄成自增的话,可以说就失去mongodb在集群方面的所有特性了。

n
notonly
我只是说MongoDB里面自动生成的_id是ObjectId类型的, 不知道能不能让它自动生成string类型的. 如果不能就只能手动生成了.
0
H
Hapjin

主键_id 不一定必须是 ObjectId类型啊。Morphia 中使用:

@Id
private Long uid;

自己指定主键。

看下面示例:
{
        "_id" : NumberLong(403),
        "nick" : "思",
        "insert" : NumberLong(1524118965),
        "register" : NumberLong(1522919207),
        "punish" : false
}

 

以上JAVA的

返回顶部
顶部