【发布时间】:2016-04-10 01:00:22
【问题描述】:
我在 MongoDB 的 x 集合中有这样的文档:
{
"_id" : ...
"attrKeys": [ "A1", "A2" ],
"attrs" : {
"A1" : {
"type" : "T1",
"value" : "13"
},
"A2" : {
"type" : "T2",
"value" : "14"
}
}
}
上面的A1 和A2 元素只是示例:attrs 字段可以包含任意数量的任意名称的键。 attrs 中的键名存储在 attrNames 字段中。
我想查询具有attr 和给定值的子字段的文档。例如,查询在attr 键映射中有一个元素的文档,其子字段type 是“T4”。像这样的:
db.x.find({"attrs.$any.type": "T4"})
(avobe 不是合法的 MongoDB 查询语言,但我认为它可以帮助理解这个想法)。
MongoDB 可以进行该查询吗?如果 MongoDB 不支持该查询,是否有任何解决方法?谢谢!
编辑:数据模型的原始版本使用attrs 的数组而不是键映射。但是,为了允许对同一个文档进行并发修改,这种情况发生了变化,转而支持键映射。
我的意思是,使用键映射,两个独立的客户端可以修改 attrs 元素,因为一个客户端可以修改 db.x.update({_id: "y"}, {$set: { "attrs.A1.value": "12" } },另一个客户端可以修改 db.x.update({_id: "y"}, {$set: { "attrs.A2.value": "55" } },而不会相互干扰。
在使用数组的情况下,并发访问要困难得多。关于如何完成的任何提示?
【问题讨论】:
-
关于“关于如何[使用数组进行并发访问]的任何提示?”如果社区认为更好,我可以单独提问。
-
您认为并发访问的问题究竟出在哪里?解释为什么你认为数组会导致问题。
-
我已经在一个单独的问题stackoverflow.com/questions/31643054/… 中详细说明了这个问题。感谢您的帮助!
标签: mongodb mongodb-query