Mongodb 元组对象数组中的Mongo搜索
我使用meteor(mongodb)作为后端,并尝试以这种方式查询保存数据的集合:Mongodb 元组对象数组中的Mongo搜索,mongodb,meteor,Mongodb,Meteor,我使用meteor(mongodb)作为后端,并尝试以这种方式查询保存数据的集合: { "name" : "Some name", "data" : [ { "0" : { "type" : "textInput", "value" : "Text", }, "1" : { "type" : "textInput", "value" : "Text", }, "2" : { "type" : "u
{
"name" : "Some name",
"data" : [
{
"0" : { "type" : "textInput", "value" : "Text", },
"1" : { "type" : "textInput", "value" : "Text", },
"2" : { "type" : "userInput", "value" : {
"userIds" : [ ... "Some mongo objectIds" ... ],
},
},
"3" : { "type" : "textInput", "value" : "Some text", }
},
{
"0" : { "type" : "textInput", "value" : "some text", },
"1" : { "type" : "textInput", "value" : "some text", },
}
],
}
数据
字段可以容纳任意数量的对象,每个对象都是一个从数字到对象的映射,具有类型
和值
字段。
具体地说,我希望找到所有具有userInput
并包含特定userId(mongo objectId)的文档。我如何使用这个数据结构
在本例中,我可以查找
“Some mongo objectid”
来查找此文档(数据的第一个对象,索引2)。使用此结构,您无法真正有效地搜索它,因为您有“命名键”,MongoDB需要知道搜索的直接路径。您最好更改结构,以便“索引”实际上在数组本身中表示。例如,“数据”
应该类似于[{“索引”:0,“类型”:“文本输入”,“值”:“文本”},{“索引”:1,“类型”:“文本输入”,“值”:“文本”}
等等。这允许您通过.find({“data”:{“$elemMatch”:{“type”:“userInput”,“userId”:userId}}})
进行查询,这是一种易于使用的形式。如果没有它,除非您使用最新的MongoDB 3.4,否则唯一可用的方法需要完整的集合扫描和JavaScript计算来遍历路径。而且它仍然是一个“完整的集合扫描”,即使“如果”我们可以避免JavaScript计算。重点是,改变结构,因为它根本不适用于一般的“数据库概念”,即按“值”搜索,而不是您目前使用的“按键搜索”。唯一的其他替代方法是通过$或
表达式指定“每个可能的索引键”。如果不是实际上不可能的话,构造一个查询几乎同样繁重和麻烦。使您的生活更轻松,并意识到此结构不适用于您需要执行的查询类型。使用此结构,您无法真正有效地搜索它,因为您有“命名密钥”,并且MongoDB需要知道搜索的直接路径。您最好更改结构,以便“索引”实际上在数组本身中表示。例如,“数据”
应该类似于[{“索引”:0,“类型”:“文本输入”,“值”:“文本”},{“索引”:1,“类型”:“文本输入”,“值”:“文本”}
等等。这允许您通过.find({“data”:{“$elemMatch”:{“type”:“userInput”,“userId”:userId}}})
进行查询,这是一种易于使用的形式。如果没有它,除非您使用最新的MongoDB 3.4,否则唯一可用的方法需要完整的集合扫描和JavaScript计算来遍历路径。而且它仍然是一个“完整的集合扫描”,即使“如果”我们可以避免JavaScript计算。重点是,改变结构,因为它根本不适用于一般的“数据库概念”,即按“值”搜索,而不是您目前使用的“按键搜索”。唯一的其他替代方法是通过$或
表达式指定“每个可能的索引键”。如果不是实际上不可能的话,构造一个查询几乎同样繁重和麻烦。使您的生活更轻松,并意识到此结构不适用于您需要执行的查询类型。