Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 元组对象数组中的Mongo搜索_Mongodb_Meteor - Fatal编程技术网

Mongodb 元组对象数组中的Mongo搜索

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

我使用meteor(mongodb)作为后端,并尝试以这种方式查询保存数据的集合:

{ 
    "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计算。重点是,改变结构,因为它根本不适用于一般的“数据库概念”,即按“值”搜索,而不是您目前使用的“按键搜索”。唯一的其他替代方法是通过
$或
表达式指定“每个可能的索引键”。如果不是实际上不可能的话,构造一个查询几乎同样繁重和麻烦。使您的生活更轻松,并意识到此结构不适用于您需要执行的查询类型。