MongoDB查询用于从嵌套数组集合中选择值

时间:2015-07-17 08:16:10

标签: json mongodb nested

我是Mongo的新手并试图弄清楚如何解析复杂的嵌套集合。

{
    "_id": ObjectId("idVal"),
    "Ids": [{
    "mar": [{
        "se": [{
            "gootics": "UA-3-1"
        }],
        "usery": [{
            "fc0633ac-81": [{
                "sep": [{
                    "custS": "",
                    "promer": "0",
                    "reaivity": "20",
                    "stus": "active",
                    "urlist": "",
                    "upe": [
                        "mat "
                    ],
                    "whlete": ""
                }],
                "uspt": [{
                    "cor": "000000",
                    "foron": "hthp",
                    "sla": "Join!",
                    "slie": "httpsg",
                    "slile": "Jost:",
                    "suody": "We'll be in touch.",
                    "sumer": "Awesome!",
                    "tte": "qumail"
                }, {
                    "cr": "000000",
                    "refeion": "htve",
                    "sla": "Go!",
                    "slige": "httg",
                    "slle": "Hes",
                    "slle": "Mm:",
                    "tte": "rk"
                }]
            }]
        }]
    }],
    And many more such inner array’ s,
    comma separated
    }]
}

我需要使用mar查询或mongo选择php的整个部分。 db.collectionname.find({"Ids" : "mar"}).pretty()

这不会产生任何结果,只是空白并尝试db.collectionname.find({}).pretty(),它运作良好,得到了所有结果。

我曾尝试使用$elemMatch$pop

许多解决方案都采用非常小而简单的json文件,没有人通过这种复杂的json字符串遍历或解析。参考其他标准流程或提供答案。

我在zist中的需要:我将只拥有Id的一个值,需要在Id的基础上进行查询。喜欢, select * from db where Id's == Id I have;在这种情况下,它可以是mar

任何人都可以帮我在php中编写相同的查询吗?并打印输出?我无法做到这一点。 "$ActualData = $collection->find(array("Ids.mar : 1"));"但这不会打印任何值。

var_dump($array);
// Above line is printing this:
array (size=0)
  empty

var_dump($ActualData);
//Above line is printing this:
object(MongoCursor)[4]

//not being executed at all:
foreach($ActualData as $doc)
{
    echo "Inside it is";
    var_dump($doc);

} 
echo "Count:".count($ActualData)."\n";
//It does have 1 document
Count:1

1 个答案:

答案 0 :(得分:1)

强烈建议您不要将动态值用作键。

如果您想获得mar,则应在查询中使用投影。

db.collection.find({},{"Ids.mar":1})

在这种情况下,您必须知道密钥mar

在PHP中,您可以将以上查询转换为:

$data = $collection->find(array(),array("Ids.mar" => 1));

OR

// Search criteria
$query = array();
// Projection (fields to include)
$projection =  array("Ids.mar" => 1);
$cursor = $collection->find($query, $projection);
foreach ($cursor as $doc) {
    //print or process here
}