更新MongoDB中一个未知父字段中给定字段的值

4
假设我有一个结构化的文档,如下所示:
datas: {
    foo: {
        ...
        keytoupdate: [...]
    },
    whatever: {
        ...
        keytoupdate: [...]
    },
    anystring: {
        ...
        keytoupdate: [...]
    },
    ...: {
        ...
        keytoupdate: [...]
    }
}

我知道:
每个“datas”文档的直接子属性都有一个“keytoupdate”字段。
“datas”文档的直接子属性因情况而异:它们的名称不一定相同,数量也不一定相同。
我想更新每个“keytoupdate”字段,无论有多少个。
问题是:我该如何做?是否有像$这样的魔术运算符可以为数组执行相同的操作?
谢谢!

1
一种解决方法是重新设计模式,使键成为属性值的一部分,因为针对动态键发出查询非常困难。您可能想查看此SO问题以获取有关如何处理它的更多详细信息。 - chridam
@chridam 很不幸,我无法重新设计架构,它嵌入在一个非常大的结构中:s - Tmb
这没有意义 - 如果您不知道keytoupdate上面的键的名称,那么您就不知道需要查询/更新哪个字段。在上面的文档中没有keytoupdate字段; 只有key1.keytoupdatekey2.keytoupdate等。您能否构思出一个明确定义的问题?您想要执行什么精确的查询和/或文档转换? - wdberkeley
@wdberkeley 刚刚完成了,看一下更新 :) - Tmb
1个回答

2
我来回答我的问题: 没有办法做到这一点,我们不能使用动态键,只需忘记它!但有两个解决方法:
  1. 最佳解决方案,由 @chridam 建议,重新设计模式以创建对象数组,其中键是数组的一部分,可以查看此问题以获取更多详细信息。
  2. 如果您无法这样做,另一个(但不好的)解决方法是为可能出现在文档中的每个字段都发出请求,而不是尝试在一个请求中完成。这是一个非常糟糕的解决方案,特别是如果您的文档可能有很多字段,并且您必须知道可能出现在文档中的哪些字段。这是一个糟糕的解决方案,绝对不是最优化的,但它实施起来简单。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接