我在为数据库创建Mongoose架构时遇到问题。我想创建一个mapId作为键的映射和一个字符串值数组作为其值。我能得到的最接近的是:
var schema = new Schema({
map: [{myId: {type:mongoose.Schema.Types.ObjectId, ref: 'MyOtherCollection'}, values: [String]}]
});
但不知怎的,这对我不起作用。当我使用{upsert:true}执行更新时,它无法正确填充地图中的键:值。事实上,我甚至不确定我是否正确地声明了架构。
有人能告诉我架构是否正确?另外,如何为此架构使用{upsert:true}执行更新?
此外,如果上述情况不正确且无法实现,那么我该如何通过其他方式对我的需求进行建模。我的用例是我想保留给定objectId的值列表。我不希望任何带有相同密钥的重复条目,这就是选择地图的原因。
请说明方法是否正确或是否应以其他方式建模?
更新
根据@phillee和this的回答,我只是想知道我们是否可以像这样修改上述thread的接受答案中提到的架构:
{
"_id" : ObjectId("4f9519d6684c8b1c9e72e367"),
... // other fields
"myId" : {
"4f9519d6684c8b1c9e73e367" : ["a","b","c"],
"4f9519d6684c8b1c9e73e369" : ["a","b"]
}
}
架构将类似于:
var schema = new Schema({
myId: {String: [String]}
});
如果是,我如何相应地更改{upsert:true}条件?此外,与线程中提到的原始模式相比,复杂性方面会更简单/复杂吗?
答案 0 :(得分:0)
我建议更改架构,这样每个myId就有一个条目,
var schema = new Schema({
myId : {type:mongoose.Schema.Types.ObjectId, ref: 'MyOtherCollection'},
values : [String]
})
如果您想更新/升值,
Model.update({ myId : myId }, { $set : { values : newValues } }, { upsert : true })