【问题标题】:Mongo query in Object of arrays数组对象中的 Mongo 查询
【发布时间】:2015-08-03 10:41:43
【问题描述】:

文档示例

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

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

需要 rails-mongo 查询。

【问题讨论】:

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


    【解决方案1】:

    如果这是您的搜索案例,那么无论您如何看待它,您都需要对 $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" }
            }
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2021-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多