0

我有一个 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 有没有办法获得正确的数组(甚至是与数组关联的字段)?或者这是我必须在服务器上做的事情?我正在使用锂框架来检索结果(以防万一)。

提前致谢 :)

4

1 回答 1

1

当您使用像campaigns.short_code这样的条件时,您仍在搜索集合,活动只是文档的属性,您的查找返回文档。因此,鉴于这种结构,您无法通过查询直接实现您想要的。

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

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

这将为您提供第一个广告系列,但由于您无法对其进行排序,因此IHEQnP在这种情况下毫无帮助。在这里阅读更多。

但是,您可以在检索完整文档后在 Lithium 中非常简单地过滤:

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

在此处查看Entity::find的文档

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

于 2011-10-06T11:33:16.623 回答