【问题标题】:YII2 -MongoDB query for filtering nested array dataYII2 - 用于过滤嵌套数组数据的MongoDB查询
【发布时间】:2015-08-30 11:13:50
【问题描述】:

我在将数据从 monogo db 嵌入式集合过滤到 YII2 框架时遇到问题。如果有人知道,请帮忙。 我有如下的类别集合。

{
    "_id" : ObjectId("55cb2133b35be8b7de137462"),
    "category" : "Technology",
    "subCategory" : [
        {
            "_id" : 1,
            "sub_category_name" : "test1"

        },
        {
            "_id" : 2,
            "sub_category_name" : "test2"

        },
        {
            "_id" : 3,
            "sub_category_name" : "test3"

        },
        {
            "_id" : 4,
            "sub_category_name" : "test4"
        }
    ]
}

我想根据对 sub_Category 应用搜索条件来获取数据。

预期结果:我想获取子类别中 ids 1 和 2 的值。

我尝试了下面的方法,但是得到了所有的子类别。

输入:$id = [1,2];

 $query = new Query;
 $rows = $query->select([])
        ->from('category')
        ->where(array('_id' => '55c9caef8fae76a4a9d96c5a','subCategory._id' =>  $id));
  $rows = $query->all();

任何人都可以帮助解决这个问题。

【问题讨论】:

    标签: mongodb yii2


    【解决方案1】:

    如果您想选择所有内容,则无需实际调用select。至于其余的,我想我注意到了 2 个问题。

    首先,我认为 Yii2 不会自动进行 MongoId 转换,因此您将看看您是否真的只使用 _id 选择将文档作为一个整体恢复(我认为不会)。其次,子文档字段的名称似乎是错误的。

    以下是我认为可以进一步帮助您的内容:

    $query = (new Query)->from('category')
       ->where(array(
         '_id' => new \MongoId('55c9caef8fae76a4a9d96c5a'),
         'subCategory._id' => [1, 2]
    ));
    $rows = $query->all();
    

    MongoDB 仅在类型值匹配时才匹配。 这就是为什么您可能需要将主要的_id 转换为MongoId 并且subCategory._id 需要是整数。在您的示例中应该没问题,但是PHP 在几次操作后往往会以字符串值变量结束(特别是如果您通过另一个数据库获得它)。因此,在这种情况下,子文档查询部分可能需要额外调用intval()

    【讨论】:

    • 对不起,我的错误是 "subCategory._id" 。但我仍然从您的查询中获取所有子类别。我也试过 $elemMatch 但没有得到确切的答案。
    • 与我认为the extension has no support for subdocuments at all 的情况相反。恐怕您将不得不依靠常规查询来解决这个问题。
    • 我通过在 yii2 中使用 mongodb 聚合方法得到了答案,例如 $collection->aggregate(array('$match' => $filterCondition), array('$skip' => $offset),数组('$limit' => intval($limit)) );
    • 您应该将此添加为答案并接受它。这样以后的人就不用搜索了。
    猜你喜欢
    • 2020-02-20
    • 1970-01-01
    • 2019-12-18
    • 2018-08-08
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多