我如何在Mongoose中定义除_id以外的其他主键?

时间:2019-09-08 12:59:10

标签: javascript node.js mongodb mongoose mongoose-schema

我想用不是_id的主键来定义Mongoose模式。该文档说,它仅允许在子文档中将模式选项标志_id设置为false。另外,我希望主键是String而不是ObjectId。可能吗?

使用二级索引是一种选择,但不是一个很好的选择,因为我想使用适当名称的主键。我也不想在不需要的时候摆弄两个不同的索引。

这会将documentId设置为辅助索引,但是由于我只想按documentId进行选择,而不会_id最终被设置为自动,因此这使得主键无用。

const DocumentSchema = new Schema({
  documentId: { type: String, index: true }
})

我想做

const DocumentSchema = new Schema({
  documentId: String
})

,然后告诉它使用documentId作为主键。

说明:我特别不想使用_id作为键,因为它的名称无用,我想使用documentId作为主键

4 个答案:

答案 0 :(得分:2)

在MongoDB中,没有主键。

您只需要一个unique: true索引就可以了。

const DocumentSchema = new Schema({
  _id: false,
  documentId: {
    type: String,
    unique: true,
    required: true
  }
})

请参见https://mongoosejs.com/docs/schematypes.htmlhttps://docs.mongodb.com/manual/core/index-unique/

  

唯一索引可确保索引字段不会存储重复项   价值观即对索引字段实施唯一性。默认情况下,   在创建期间,MongoDB在_id字段上创建唯一索引   集合。

答案 1 :(得分:1)

您可以在架构阶段手动定义_id字段,例如:

const DocumentSchema = new Schema({
  _id: String //or number, or (increment) function,
  ...
  other_field: BSON_type,
})

_id阶段之前将insert的值添加到文档中,或者通过函数或npm部分的this之类的schema模块生成它。您唯一需要确保的是,您自定义生成的_id值必须唯一。如果不这样做,在插入不带唯一_id值的文档时,mongo会向您返回错误。

//嗯,起初我没有看到Clarification部分,因为问题正在编辑中。但是无论如何,如果有一天想回到经典的_id字段,仍然是一种选择。

答案 2 :(得分:0)

from itertools import chain
from collections import Counter

a = [{'foo','cpu','phone'},{'foo','mouse'}, {'dog','cat'}, {'cpu'}]

c = Counter(chain.from_iterable(map(list, a)))
res = list(filter(None, ({item for item in s if c[item] >= 2} for s in a)))

print(res)
Out: [{'foo', 'cpu'}, {'foo'}, {'cpu'}]

答案 3 :(得分:0)

建立索引将是最好的方法。实际上,_id也是索引。尝试创建如下索引:

documentSchema.index({ 'documentId' : 1 }, { unique: true });

引用:https://docs.mongodb.com/manual/indexes/