我想用不是_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
作为主键
答案 0 :(得分:2)
在MongoDB中,没有主键。
您只需要一个unique: true
索引就可以了。
const DocumentSchema = new Schema({
_id: false,
documentId: {
type: String,
unique: true,
required: true
}
})
请参见https://mongoosejs.com/docs/schematypes.html和https://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 });