我有以下数组:
Array
(
[data.cars] => 44
[data.xp] => Array
(
[$gte] => 100
[$lte] => 500
)
[data.money] => Array
(
[$gte] => 200
[$lte] => 1000
)
)
发出此数组以find
时,它将返回 NULL。我做错了什么吗,我根据此页面对其进行了格式化,在这里:
http://us1.php.net/manual/en/mongo.sqltomongo.php
所以基本上,如果我有
SELECT * FROM mytable WHERE data.cars = 44 AND data.xp >= 100 AND data.xp <= 500 AND data.money >= 200 AND data.money <= 1000
在控制台中运行时,此查询正好给出 4 个结果。
下面是查询:
{$and:[{"data.cars":44}, {"data.xp": {$gt:100, $lt:500}}, {"data.money": {$gt:200, $lt:1000}}]}
我的数组应该可以工作,但是嘿,它没有,请指出我做错了什么。
谢谢!
MongoDB PHP 上的查询应格式化如下:
array(
'data.cars' => 44,
'data.xp' => array(
'$gt' => 100,
'$lt' => 500
),
'data.money' => array(
'$gt' => 200,
'$lt' => 1000
)
)
通过在两个版本的数组上做json_encode()
,乍一看似乎相同,但正如您将看到的,它们不是,我发现了"错误"。
两个数组如下所示:
array(
'data.cars' => 44,
'data.xp' => array(
'$gt' => 100,
'$lt' => 500
),
'data.money' => array(
'$gt' => 200,
'$lt' => 1000
)
);
一个是硬编码的,另一个是动态构建的,但两个 json 编码是不同的,它们是:
{"data.cars":"44","data.xp":{"$gte":"100","$lte":"500"},"data.money":{"$gte":"200","$lte":"1000"}}
{"data.cars":44,"data.xp":{"$gte":100,"$lte":500},"data.money":{"$gte":200,"$lte":1000}}
第一个数组将值作为字符串,但在常规print_r或var_dump上看不到,所以我所做的是对值施加的强制,然后......它:)
谢谢大家的努力和兴趣!
首先,在键名中使用 . 或 $ 符号真的很糟糕(我实际上认为这是非法的)。这是因为点运算符用于访问子文档。
所以第一件事就是改变这一点。第二件事是你不需要那里$and。因此,如果您想找到具有 a = 1 和 b = 2 的文档,那么您不需要做{$and : .... }
您需要做的就是{a : 1, b : 2}