Mongodb Mongo中对象层次结构中任意位置具有值的查询键
在Mongo中,如何找到具有给定键和值的所有文档,而不管该键在文档的键/值层次结构中出现在何处 例如,输入键Mongodb Mongo中对象层次结构中任意位置具有值的查询键,mongodb,Mongodb,在Mongo中,如何找到具有给定键和值的所有文档,而不管该键在文档的键/值层次结构中出现在何处 例如,输入键roID和值5将同时匹配: { roID: '5' } 及 没有内置的方法可以做到这一点。您可能必须递归地扫描每个匹配的文档,以尝试定位该属性不推荐使用。您可能需要考虑重新构造数据,或者将其转换为更统一的格式,以便查询更容易(更快) 如果您所需的钥匙出现在固定数量的不同位置,您可以使用$或操作符扫描所有可能的位置 以示例文档为例,您的查询如下所示: db.data.find( {
roID
和值5
将同时匹配:
{
roID: '5'
}
及
没有内置的方法可以做到这一点。您可能必须递归地扫描每个匹配的文档,以尝试定位该属性不推荐使用。您可能需要考虑重新构造数据,或者将其转换为更统一的格式,以便查询更容易(更快)
如果您所需的钥匙出现在固定数量的不同位置,您可以使用
$或
操作符扫描所有可能的位置
以示例文档为例,您的查询如下所示:
db.data.find( { "$or": [
{ "roID": 5 },
{ "other.roID": 5 },
{ "foo.bar.roID": 5 },
{ any other possbile locations of roID },
...
] } )
如果收集的文档数量不太多,则可以通过以下方法完成:
db.system.js.save({_id:"keyValueExisted", value: function (key, value) {
function findme(obj) {
for (var x in obj) {
var v = obj[x];
if (x == key && v == value) {
return true;
} else if (v instanceof Object) {
if (findme(v)) return true;
}
}
return false;
}
return findme(this);
}});
var param = ['roID', '5'];
db.c.find({$where: "keyValueExisted.apply(this, " + tojsononeline(param) + ");"});
我相信你会理解你的要求效率低下。您必须递归地扫描每个文档,以尝试定位该属性。更好的问题是解释您的实际用例,以及为什么您“认为”需要以这种方式建模。这给了人们一些东西,让他们根据“真正的解决方案”来做你想做的事情。但是,在任何深度都没有简单的方法可以做到这一点,而不需要在JavaScript代码中遍历文档。因此,您可能需要一个新的结构来解决您的问题problem@Lix是的,你说得对。我相信有更好的方法来实现我的目标。是的,固定地点路线更有意义。我想我希望有一个内置的方法来摆脱懒惰。
db.system.js.save({_id:"keyValueExisted", value: function (key, value) {
function findme(obj) {
for (var x in obj) {
var v = obj[x];
if (x == key && v == value) {
return true;
} else if (v instanceof Object) {
if (findme(v)) return true;
}
}
return false;
}
return findme(this);
}});
var param = ['roID', '5'];
db.c.find({$where: "keyValueExisted.apply(this, " + tojsononeline(param) + ");"});