使用ObjectId键和字符串数组定义地图作为mongoose模式中的值

时间:2015-08-16 18:39:05

标签: node.js mongodb mongoose node-mongodb-native

我在为数据库创建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}条件?此外,与线程中提到的原始模式相比,复杂性方面会更简单/复杂吗?

1 个答案:

答案 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 })