如何通过Javascript查询MongoDb中的key:value对?
How to query a key:value pair in MongoDb via Javascript?
我已经检查过了,尽管我发现了类似的问题,但我的问题有所不同,因为我使用的是可变密钥。
我的数据如下:
{
"_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.start[kitUser]
在JS中很容易访问2个对应的key:value对象start和end where kitUser 将是上面 cousins 数组中存在的 4 个字符串中的任何一个。
例如,通过终端查询上述文档将是:
db.groups.find({
cousins: "B1KLeIiQE",
chr: "1",
"start.B1KLeIiQE": {
$lte: 35000000
},
"end.B1KLeIiQE": {
$gte: 1
}
})
然后我将相应的键 'B1KLeIiQE' 转换为 start 的值 18683049 和 end 的 26384690 .
但是我无法让上述查询在 Javascript 中工作,因为我无法以灵活的方式解析要查询的字段(意味着包括密钥必须生成的任何值 'start.B1KLeIiQE' 还有 'end.B1KLeIiQE').
我当前的(失败的)代码如下所示:
const chr = '1';
const start = 1;
const end = 35000000;
const groupsArray = Groups.find({ chr, 'start.kitUser': { $lte: end },
'end.kitUser': { $gte: start }, cousins: kitUser }).fetch();
我也无法在这 2 个 key:value 对象上创建索引(因为每个索引有 1024 字节的限制,我有 1 个文档有 1853 字节)但我有一个复合索引在 cousins 和 chr 上,它在应用过滤器之前缩小了结果范围。
我确实喜欢 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();
我已经检查过了,尽管我发现了类似的问题,但我的问题有所不同,因为我使用的是可变密钥。
我的数据如下:
{
"_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.start[kitUser]
在JS中很容易访问2个对应的key:value对象start和end where kitUser 将是上面 cousins 数组中存在的 4 个字符串中的任何一个。
例如,通过终端查询上述文档将是:
db.groups.find({
cousins: "B1KLeIiQE",
chr: "1",
"start.B1KLeIiQE": {
$lte: 35000000
},
"end.B1KLeIiQE": {
$gte: 1
}
})
然后我将相应的键 'B1KLeIiQE' 转换为 start 的值 18683049 和 end 的 26384690 .
但是我无法让上述查询在 Javascript 中工作,因为我无法以灵活的方式解析要查询的字段(意味着包括密钥必须生成的任何值 'start.B1KLeIiQE' 还有 'end.B1KLeIiQE').
我当前的(失败的)代码如下所示:
const chr = '1';
const start = 1;
const end = 35000000;
const groupsArray = Groups.find({ chr, 'start.kitUser': { $lte: end },
'end.kitUser': { $gte: start }, cousins: kitUser }).fetch();
我也无法在这 2 个 key:value 对象上创建索引(因为每个索引有 1024 字节的限制,我有 1 个文档有 1853 字节)但我有一个复合索引在 cousins 和 chr 上,它在应用过滤器之前缩小了结果范围。
我确实喜欢 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();