2011-10-05 49 views
0

选择从阵列独特的领域我有一个MongoDB的结构,目前看起来是这样的:使用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}) 

然而,返回所有的阵列,而不是仅仅一个(或领域),我想要的。

是否有蒙戈的方式来得到正确的阵列(或偶数场与阵列相关)?或者是我在服务器上必须做的事情?我正在使用锂框架来检索结果(以防它有用)。

感谢提前:)

回答

1

当你使用一个标准像campaigns.short_code你还在寻找的收藏,活动只是一个文件的属性,你发现返回文档。 因此,给定这种结构,你不能直接通过查询来实现你想要的。

阵列MongoDB中也可以切成片,但没有排序:

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

这将使你的第一次竞选,但你不能排序,使IHEQnP是在这种情况下,顶部没有帮助其。 阅读更多here

你可以检索但完整的文档后,过滤此锂很简单:

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

实体文档::找到here

我的解决办法是,如果要保持它在用户广告系列的数量很少(只要文档大小不太大,就可以在PHP中快速排序和过滤)。 如果这一预期增长,然后看它移动到自己的模型/收集或重新考虑你如何建模数据。

+0

感谢这个答案 - 我还没有看到之前使用第二种方法并没有意识到我能做的内部搜索这种方式;这真的很有用!我找到了另一种方法来构造数据并找到所需的数据(尽管在两个数据库调用中)。 我绝不会想到这些广告活动中的每个用户达到了100,但它是一个有点棘手使用MongoDB的于预期,或许应该已经使用MySQL的关系(如蒙戈我有多个重复数据相当多的情况下,楷模)。 再次感谢!肯定会检查出第二种方法:) – Dan