2011-11-29 89 views
1

我有一个通过C#驱动程序存储的文档。它有一个SortedList属性。这里的文档外观MongoDB中:查询MongoDB中的一个集合

{ 
    "_id": { 
    "$oid": "47f1f704c42f56380ac80000" 
    }, 
    "Things": { 
    "abc": { 
     "Color": "blue", 
     "Shape": "square", 
    } 
    "def": { 
     "Color": "red", 
     "Shape": "circle" 
    } 
    } 
} 

这里ThingsSortedList,并MyClassColorShape性能。我遇到的问题是试图在Things内查询。

具体来说,我想要做的是设置每个MyClass具有某种颜色的颜色。我无法弄清楚如何去做,因为它的索引似乎是一个有效的动态字段名称。

回答

0

什么是'abc'和'def'?从未尝试序列化SortedList。如果您使用T列表,它将创建一个嵌入式数组,而不是您在此处嵌入的文档。

您可以使用点符号在嵌入式文档和数组内查询,但是在这里您必须执行Things.abc.Color或Things.def.Color。

+0

是的,我明白它是如何工作的,如果它只是一个类的列表。但是在这里它是,所以你最终将字符串值作为关键字(abc,def)。所以我不能使用点符号,因为有成千上万个,每个都有唯一的字符串键。我真正需要的是一个占位符,所以我可以查询Things.X.Color,其中X匹配任何内容。 – user1070663

+0

您无法以这种方式查询SortedList。你不能使用这样的通配符。 – Joe

1

要做的最好的事情可能是改变你的文档结构。

将“东西”关键点指向MyClass的数组,并采用您在键入时使用的内容,并将它作为数组中文档的名称键。

{ 
    "_id": { 
    "oid": "47f1f704c42f56380ac80000" 
    }, 
    "Things": [ 
    { 
     "Name": "abc", 
     "Color": "blue", 
     "Shape": "square", 
    }, 
    { 
     "Name": "def", 
     "Color": "red", 
     "Shape": "circle" 
    } 
    ] 
} 

一旦你的文档设置方式,您可以使用位置操作,以更新的东西阵列符合您的查询像这样在第一MyClass

db.things.update({ "Things.Color": "blue" }, {$set: {"Things.$.Color": "red"} })

如果你想更改所有匹配的项目,您实际询问的内容,您可能需要执行$ where查询来遍历数组中的东西。