按Doctrine MongoDB ODM中的参考文档排序

时间:2012-12-14 13:36:50

标签: mongodb symfony mongodb-php

我正在使用DoctrineMongoDBOBundle和Symfony2。

我有一个文档产品,它有一个注释referenceOne到其他文档价格。

我想在使用queryBuilder获取时按价格排序。

$qb = $dm->createQueryBuilder('MyBundle:Product')
->field('geocoordinates')
->near('lat','lon')
->sort('hasPrice','desc')

但这不起作用。也许是为了使用附近?

它取决于Document Price的toString()方法?

问候。

2 个答案:

答案 0 :(得分:2)

  

我有一个文档产品,它有一个注释referenceOne到其他文档价格。

MongoDB中没有连接,我不相信Doctrine会在这里进行客户端聚合和排序。因此,无论如何这都行不通。

然而,排序将适用于$near命令(http://docs.mongodb.org/manual/reference/operator/near/),这是Doctrine在这种情况下应该使用的命令,在这里您可以看到通过命令识别$near的明确支持您正在使用:https://github.com/doctrine/mongodb/commit/59f73cde2c15d171ff39afbf46c1a1339a51048c所以您的问题是链接文档,MongoDB没有JOIN。

答案 1 :(得分:0)

在这种情况下,hasPrice看起来像是一个方法,可能会检查price引用是否为null。在引用ODM查询中的字段时,可以将类属性的名称转换为MongoDB字段名称(如果它们不同),但不支持方法评估。 Sammaye是正确的,Doctrine没有客户端聚合或排序。

作为替代方案,您可以对price.$id字段进行排序,该字段应在结果中将不存在的值组合在一起。同样,您可以使用$exists运算符根据文档是否实际引用来匹配/排除。 ODM中的引用(不包括“简单”类型)存储为MongoDBRef个实例,这些实例会转换为包含$id$ref$db字段的对象。因此,您可以像查看文档中的任何其他字段一样查询这些值。