1

我正在使用 DoctrineMongoDBBundle 并想要获取一些记录。在我的存储库类中,我有代码:

return $this->createQueryBuilder()->field('categories.data')
    ->equals($categoryId)->getQuery()->execute();

在探查器的日志中,它生成绝对有效的查询:

db.recipe.find({ "categories.data": 16 }).sort([ ]);

当我通过控制台客户端运行此查询时,它会返回记录。但是存储库类什么都没有。

我的服务器日志如下所示:

query test_database.recipe query: { $query: { categories.data: "2" }, $orderby: {} } ntoreturn:0 keyUpdates:0 nreturned:0 reslen:20 0ms

但是如果我运行普通的 PHP 脚本来获取相同的数据:

<?php 
$mongo = new Mongo();
$col = $mongo->test_database->recipe;

foreach ($col->find(array("categories.data" => 2)) as $r) {
  print_r($r);
}

我得到了结果,服务器的日志如下所示:

query test_database.recipe query: { categories.data: 2 } ntoreturn:0 keyUpdates:0 nreturned:1 reslen:1037 0ms

所以区别是:

查询 test_database.recipe 查询:{ $query: { categories.data: "2" }, $orderby : {} } ntoreturn:0 keyUpdates:0 nreturned:0 reslen :20 0ms

查询 test_database.recipe 查询:{ categories.data: 2 } ntoreturn:0 keyUpdates:0 nreturned :1 reslen:1037 0ms[/quote]

检查了 MongoDB 2.1.1 和 1.8.1,deps文件:

[symfony]
    git=http://github.com/symfony/symfony.git
    version=origin/2.0

[doctrine-common]
    git=http://github.com/doctrine/common.git
    version=2.2.2

[doctrine-dbal]
    git=http://github.com/doctrine/dbal.git
    version=2.1.7

[doctrine]
    git=http://github.com/doctrine/doctrine2.git
    version=2.1.7

[doctrine-mongodb-odm]
    git=http://github.com/doctrine/mongodb-odm.git

[DoctrineMongoDBBundle]
    git=http://github.com/doctrine/DoctrineMongoDBBundle.git
    target=/bundles/Symfony/Bundle/DoctrineMongoDBBundle
    version=origin/2.0
4

1 回答 1

1

根据您共享的此日志:

查询 test_database.recipe 查询:{ $query: { categories.data: "2" }, $orderby: {} } ntoreturn:0 keyUpdates:0 nreturned:0 reslen:20 0ms

查询 test_database.recipe 查询:{ categories.data:2 } ntoreturn:0 keyUpdates:0 nreturned:1 reslen:1037 0ms

"2"在第一个查询中匹配字符串,但在第二个查询中匹配整数2。这些在 MongoDB 中是不等价的。考虑:

$ mongo
MongoDB shell version: 2.0.7
connecting to: test
> db.foo.drop()
false
> db.foo.insert({x:1})
> db.foo.find({x:"1"})
> db.foo.find({x:1})
{ "_id" : ObjectId("502fb9f5b6b1fd9f6ea794a4"), "x" : 1 }

在查询生成器中使用它之前,您是否尝试过强制转换$categoryId为整数?

于 2012-08-18T15:54:56.873 回答