????????? MongoDb ??????“???”???
Posted
技术标签:
【中文标题】是否可以在创建时在 MongoDb 子文档中创建“不修改”约束?【英文标题】:Is it possible to make a "not modify " constrain on MongoDb subdocuments at creation? 【发布时间】:2013-12-05 19:44:30 【问题描述】:我想修复 MondoDb 文档中的特定子文档值,因此无法在下次更新或任何其他可以修改文档的 MongoDb 操作时对其进行修改。 例如,如果插入像下面这样的文档,我会喜欢“eyesColor”值不能更改。 "id" : "someId", “姓名”:“简”, "eyesColor" : "蓝色" 可能的更新是: "id" : "someId", “姓名”:“艾米”, "eyesColor" : "绿色" 更新后我需要的结果是: "id" : "someId", “姓名”:“艾米”, "eyesColor" : "蓝色" 我想这样做是因为我正在创建的项目中不存在使用 $set 和 $unset 运算符的可能性。在更新之前读取现有文档以获取子文档的值(“eyesColor”)会降低我正在处理的应用程序的性能。
实际上我需要的约束类似于集合上的固定大小(封顶集合)。不同之处在于它在子文档而不是集合上,在子文档中包含的值而不是大小上。
这种类型的约束有什么解决方案吗?
【问题讨论】:
这是功课吗?你试过什么update
s?您可以指定条件。
@WiredPrairie 不,是一个课外项目。我使用了 DbCollection.update(DBObject q , DBObject o , boolean upsert , boolean multi) 和 upsert 和 multi on 'false'。谢谢
您尝试过哪些限制条件?
唯一使用的约束是“id”上的唯一索引。
如果您尝试选择性地仅插入某些字段,则不能。您需要将其作为两个查询来执行,或者将其构建到您的业务逻辑中。
【参考方案1】:
MongoDB 中没有约束(唯一的例外:唯一索引)。无法在数据库层将字段设为“只读”。
如果您想使用 upsert(db.collection.update
和 upsert: true
)在插入新文档时添加某些字段但在更新现有文档时不影响这些字段,您可以将这些字段放在 $setOnInsert
-operator 后面。
【讨论】:
以上是关于????????? MongoDb ??????“???”???的主要内容,如果未能解决你的问题,请参考以下文章