2

1) 如何获取所有点赞数超过 50 的歌曲?结果集应该返回一个歌曲数组而不是整个文档。

2) 如何返回特定歌曲 ID 而不是整个文档的结果?

到目前为止,我遇到了嵌入对象的虚拟集合的概念。但是,此后一直没有实施。虽然,在同一个链接上,有人建议使用聚合框架来做这样的事情。这是一个可行的解决方案吗?

我有以下文档结构:

document = {
  'date' => Time.now.utc.strftime('%Y%m%d'),
  'songs' => {
    '1' => {
      'views' => {
        'non_uniques' => 2000,
        'uniques' => 203
      },
      'countries' => {
        'us' => 123,
        'uk' => 11
      },
      'likes' => 123,
      'comments' => 123
    },
    '2' => {
      'views' => {
        'non_uniques' => 2000,
        'uniques' => 203
      },
      'countries' => {
        'us' => 123,
        'uk' => 11
      },
      'likes' => 123,
      'comments' => 123
    }
  },
  'sign_ins' => {
    'non_uniques' => 2000,
    'uniques' => 203
  }
}

预期输出(按要求)

对于问题 1),在以下几行中的某处:

['1' => { 'views' => { 'non_uniques' => 2000, 'uniques' => 203 }, 'countries' => { 'us' => 123, 'uk' => 11 }, 'likes' => 123, 'comments' => 123 }, '2' => { 'views' => { 'non_uniques' => 2000, 'uniques' => 203 }, 'countries' => { 'us' => 123, 'uk' => 11 }, 'likes' => 123, 'comments' => 123 }]

对于 2):

'1' => { 'views' => { 'non_uniques' => 2000, 'uniques' => 203 }, 'countries' => { 'us' => 123, 'uk' => 11 }, 'likes' => 123, 'comments' => 123 }

4

3 回答 3

1

像这样使用聚合框架:

db.songs.aggregate({$unwind:"$songs"},{$match:{"songs.likes":{$gt:50}}})

现在,您可以添加其他阶段,例如 {$group} 如果您希望将内容恢复到一个文档中,或者 $project 以更改字段名称等。

于 2013-05-08T02:08:24.273 回答
0

更改文档中的“=>”分隔符。然后你会有一个 JSON 文件

document = JSON.parse(document)

你会得到一个哈希。然后检查哈希中是否喜欢> 50

document[].each do |song|
    song[].each do |id|    
        if id[likes].to_i > 50
            #Do what you want to do
        end 
    end
end

希望有帮助

于 2013-05-07T12:13:44.583 回答
0

尝试:

songs_arr = [] 
document["songs"].keys.each do |key|
  songs_arr << "insert songs here"  if document["songs"][key]["likes"] > 50
end
于 2013-05-07T12:23:12.913 回答