我有一个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中有没有办法获得正确的数组(甚至是与数组相关的字段)?或者是我在服务器上必须做的事情?我正在使用锂框架来检索结果(如果有帮助的话)。
提前致谢:)
丹
答案 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)。 如果预计会增长,那么请考虑将其移至自己的模型/集合,或者重新考虑如何对数据建模。