如何通过Javascript查询MongoDb中的key:value对?

如何通过Javascript查询MongoDb中的key:value对?,javascript,mongodb,meteor,key-value,Javascript,Mongodb,Meteor,Key Value,我已经检查过了,虽然我发现了类似的问题,但我的问题不同,因为我使用的是变量键 我的数据如下: { "_id": "p9AXNCtfX5AWT5jRw", "chr": "1", "cousins": [ "B1KLeIiQE", "H195r77hQ4", "rkFnSX7n74", "H8P6QcQXX" ], "end": { "B1KLeIiQE": 26384690, "H195r77hQ4": 25029488,

我已经检查过了,虽然我发现了类似的问题,但我的问题不同,因为我使用的是变量键

我的数据如下:

{
  "_id": "p9AXNCtfX5AWT5jRw",
  "chr": "1",
  "cousins": [
    "B1KLeIiQE",
    "H195r77hQ4",
    "rkFnSX7n74",
    "H8P6QcQXX"
  ],
  "end": {
    "B1KLeIiQE": 26384690,
    "H195r77hQ4": 25029488,
    "rkFnSX7n74": 26384690,
    "H8P6QcQXX": 25224010
  },
  "numCousins": 4,
  "start": {
    "B1KLeIiQE": 18683049,
    "H195r77hQ4": 18643577,
    "rkFnSX7n74": 18650794,
    "H8P6QcQXX": 18643577
  }
}
通过
gDoc很容易访问JS中的2个对应键:value objectsstartend。start[kitUser]
其中kitUser将是上述cosins数组中的4个字符串中的任意一个

因此,通过终端查询上述文件将是:

db.groups.find({
  cousins: "B1KLeIiQE",
  chr: "1",
  "start.B1KLeIiQE": {
    $lte: 35000000
  },
  "end.B1KLeIiQE": {
    $gte: 1
  }
})
然后我将相应的键'b1kleiqe'转换为开始的值18683049和结束的值26384690

但是,我无法使上述查询在Javascript中工作,因为我无法以灵活的方式解析要查询的字段(这意味着包含键必须生成“start.b1kleiqe”和“end.b1kleiqe”的任何值)

我当前(失败)的代码如下所示:

我也不能在这两个key:value对象上创建索引(因为每个索引有1024字节的限制,我有一个文档有1853字节),但是我在cousinschr上有一个复合索引,它在应用过滤器之前缩小了结果范围


我确实喜欢2个key:value对象的简单结构,但我愿意接受更改该格式的建议,以便可以在Javascript(Meteor)中运行查询。

如果代码中存在语法错误,请尝试以下方法:

const chr     = '1';
const start   = 1;
const end     = 35000000;
const kitUser = 'B1KLeIiQE';
const query   = {};
query['chr']  = chr;
query['start.' + kitUser]  = { '$lte': end };
query['end.' + kitUser]  = { '$gte: start }; 
query['cousins']  = kitUser;
const groupsArray = Groups.find(query).fetch();

非常感谢@Valijon,这是一个非常创新的解决方案,它工作得非常完美!
const chr     = '1';
const start   = 1;
const end     = 35000000;
const kitUser = 'B1KLeIiQE';
const query   = {};
query['chr']  = chr;
query['start.' + kitUser]  = { '$lte': end };
query['end.' + kitUser]  = { '$gte: start }; 
query['cousins']  = kitUser;
const groupsArray = Groups.find(query).fetch();