【问题标题】:Is it possible to make a "not modify " constrain on MongoDb subdocuments at creation?是否可以在创建时在 MongoDb 子文档中创建“不修改”约束?
【发布时间】:2013-12-05 19:44:30
【问题描述】:


我想修复 MondoDb 文档中的特定子文档值,因此无法在下次更新或任何其他可以修改文档的 MongoDb 操作时对其进行修改。
例如,如果插入像下面这样的文档,我会喜欢“eyesColor”值不能更改。
{
"id" : "someId",
“姓名”:“简”,
"eyesColor" : "蓝色"
}

可能的更新是:
{
"id" : "someId",
“姓名”:“艾米”,
"eyesColor" : "绿色"
}
更新后我需要的结果是:
{
"id" : "someId",
“姓名”:“艾米”,
"eyesColor" : "蓝色"
}
我想这样做是因为我正在创建的项目中不存在使用 $set 和 $unset 运算符的可能性。在更新之前读取现有文档以获取子文档的值(“eyesColor”)会降低我正在处理的应用程序的性能。

实际上我需要的约束类似于集合上的固定大小(封顶集合)。不同之处在于它在子文档而不是集合上,在子文档中包含的值而不是大小上。

这种类型的约束有什么解决方案吗?

【问题讨论】:

  • 这是功课吗?你试过什么updates?您可以指定条件。
  • @WiredPrairie 不,是一个课外项目。我使用了 DbCollection.update(DBObject q , DBObject o , boolean upsert , boolean multi) 和 upsert 和 multi on 'false'。谢谢
  • 您尝试过哪些限制条件?
  • 唯一使用的约束是“id”上的唯一索引。
  • 如果您尝试选择性地仅插入某些字段,则不能。您需要将其作为两个查询来执行,或者将其构建到您的业务逻辑中。

标签: mongodb constraints check-constraints subdocument


【解决方案1】:

MongoDB 中没有约束(唯一的例外:唯一索引)。无法在数据库层将字段设为“只读”。

如果您想使用 upsert(db.collection.updateupsert: true)在插入新文档时添加某些字段但在更新现有文档时不影响这些字段,您可以将这些字段放在 $setOnInsert-operator 后面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多