在文档中自动创建值(如触发器?或自动增量值?)

时间:2014-01-25 22:57:43

标签: mongodb

我确定我在最新一本书中读到了一些内容,您可以在创建服务器端时自动设置要在文档中创建的值。我确定它与索引有关..但我找不到它!

也就是说,如果插入文档,MongoDB本身会主动创建值。

显而易见的解决方案是将值创建为应用程序端 - 但长话短说,在这个特定的实例中,这是完全不可能的。我不会问这个问题,如果我没有看到我曾经读过它可以在服务器端完成。

我还查看了自动增量值,但我的值必须始终为0,而​​且我似乎无法在不完全替换_id值(?)的情况下执行此操作。

另一个选择是在MongoDB之外设置一个服务器端脚本,当看到新文档时,它会更新它以获得值。但想看看MongoDB是否有内置功能。<​​/ p>

tl; dr MongoDB可以在创建时自动在文档中创建一个值吗?或者我是否想过读这篇文章?

2 个答案:

答案 0 :(得分:0)

目前,mongo中没有触发器(但您可以在此投票支持此功能 - &gt; https://jira.mongodb.org/browse/SERVER-124)。

答案 1 :(得分:0)

默认值

与MongoDB 2.4一样,没有服务器端支持在插入文档时为任意字段设置默认值,而不在insert / upsert中指定这些字段值。这意味着某种模式验证或服务器端触发器,这些都不是当前的MongoDB功能(或近期可能的,恕我直言)。

如果您插入的文档没有_id字段(文档所需的主键),则客户端驱动程序将为此生成ObjectID。如果应用程序或驱动程序未提供_id,则作为最后的手段,MongoDB服务器将生成新的ObjectID

$setOnInsert运营商

如果你正在做upserts(如果文档存在则更新,否则插入一个新文档),有一个$setOnInsert operator 可能就是你所读到的。使用此运算符,您可以在upsert导致插入时为字段提供默认值。不过,这仍然在应用程序方面完成。

如果你决心伪造它

由于您之前提到无法修改应用程序代码,因此以下是一些可能的解决方法。需要说明的是,这些仍然涉及编写应用程序代码,但要解决不更改原始应用程序代码的限制(肯定是最直接和最强大的方法)。

  1. 编写一个脚本,查找集合中缺少必填字段的文档(使用{ $exists: false })并更新具有所需默认值的文档。您可以将其作为预定作业运行(即在Linux上使用cron),并根据您需要立即存在的默认字段来调整频率。

  2. 如果您需要以更“实时”的方式添加默认值,则可以使用Tailable Cursor。这将涉及将MongoDB部署配置为副本集(如果尚未配置),以便创建oplog。您必须编写自定义代码来拖尾oplog并检查相关插入以查看它们是否缺少默认字段(并根据需要进行更新)。有一个Mongo Connector可能是一个有用的起点。