使用MongoDB从数组中选择唯一字段

时间:2011-10-05 21:53:16

标签: mongodb mongodb-php lithium

我有一个MongoDB结构,目前看起来像这样:

[campaigns] => Array (
    [0] => Array (
        [campaign_id] => 4e8cba7a0b7aabea08000006
        [short_code] => IHEQnP
        [users] => Array (
        )
    )
    [1] => Array (
        [campaign_id] => 4e8ccf7c0b7aabe508000007
        [short_code] => QLU_IY
        [users] => Array (
        )
    )
)

我希望能够做的是搜索短代码,然后返回相关的数组。我最初尝试过:

db.users.find({'campaigns.short_code':'IHEQnP'}, {'campaigns.campaign_id':1})

然而,它返回所有数组,而不是我想要的那个(或字段)。

Mongo中有没有办法获得正确的数组(甚至是与数组相关的字段)?或者是我在服务器上必须做的事情?我正在使用锂框架来检索结果(如果有帮助的话)。

提前致谢:)

1 个答案:

答案 0 :(得分:1)

当您使用 campaigns.short_code 等条件时,您仍在搜索该集合,广告系列只是文档的属性,您的查找会返回文档。 因此,鉴于此结构,您无法直接通过查询实现所需内容。

MongoDb中的数组可以切片,但不能排序:

db.users.find({}, {campaigns: { $slice : 1}})

这会为您提供第一个广告系列,但是由于您无法对其进行排序,所以 IHEQnP 在这种情况下无可奈何。 阅读更多here

然而,在检索完整文档后,您可以在Lithium中过滤这一过程非常简单:

$id = 'id to match against';
$result = $user->campaigns->find(function($model) use ($id) {
    return $model->campaign_id === $id
});

请参阅 Entity :: find here

的文档

我的解决方案是在广告系列数量较少的情况下将其保留在用户中(只要文档大小太大,就可以快速排序和过滤PHP)。 如果预计会增长,那么请考虑将其移至自己的模型/集合,或者重新考虑如何对数据建模。