Mongo查询数组的Object

时间:2015-08-03 10:41:44

标签: ruby-on-rails mongodb mongoid mongodb-query

文档示例

{
   "_id": 1, 
   "test": {
     "item_obj": {
       "item1": ["a", "b"],
       "item2": ["c"],
       "item3": ["a", "d"]
     }
   }
}

我想fetch documents where "a" exists in test.item_obj。 ""可能存在于任何数组中。而且我们不知道item_obj中存在的键(不知道item1,item2或item3是否存在)。

需要rails-mongo查询。

1 个答案:

答案 0 :(得分:2)

如果这是您的搜索案例,那么无论您如何看待它,都需要对$where子句进行JavaScript评估以解析您当前的结构。在shell示例中(因为您无论如何都需要使用JavaScript表达式):

db.collection.find(function() {
    var root = this.test.item_obj;
    return Object.keys(root).some(function(key) {
        return root[key] == "a";
    });
})

或类似的mongoid:

func = <<-eof
    var root = this.test.item_obj;
    return Object.keys(root).some(function(key) {
        return root[key] == "a";
    });
eof

Model.for_js(func)

但是,如果您只是更改结构以将“items_objects”定义为数组,如下所示:

{
    "_id": 1,
    "test": {
        "item_objects": [
            { "name": "item1", "data": ["a","b"] },
            { "name": "item2", "data": ["c"] },
            { "name": "item3", "data": ["a","d"] }
        }
    }
}

然后在这里询问你想要的是基本的:

db.collection.find({
    "test.item_objects.data": "a"
})

或者是mongoid:

Model.where( "test.item_objects.data" => "a" )

嵌套数组虽然不是一个好主意,所以也许可以使用:

{
    "_id": 1,
    "test": {
        "item_objects": [
            { "name": "item1", "data": "a" },
            { "name": "item1", "data": "b" },
            { "name": "item2", "data": "c" },
            { "name": "item3", "data": "a" },
            { "name": "item3", "data": "d" }
        }
    }
}

这基本上是一回事,但是更长的啰嗦。但最终在原子更新中处理起来要容易得多。当然,查找文档中的值的查询完全相同。