我有一个包含艺术家,歌曲标题和其他一些数据的对象数组,例如:
var obj = {
artist: 'Of Monsters and Men',
title: 'Little Talks',
data: 'important thing'
}
var array = [<obj1>, <obj2>, <obj3>];
我还有一个包含歌曲的mongoDB集合。我需要查询这个集合并返回所有包含艺术家和前一个数组中包含的标题的歌曲。我还需要访问匹配对象的数据字段 我曾经在数组中循环并对每个对象执行查询,但它消耗了太多资源,因为数组中可能有数百/数千个对象。有没有办法实现它?
答案 0 :(得分:3)
正如@vmr建议的那样,你可以改变你的架构,但如果你不想这样做,这里有几个选项:
您可以使用聚合框架。
`db.collection.aggregate( { $group: {
_id:{artist:"$artist", title:"$title"},
data:{$push:"$data"}
}, function(err, result){})`
**请记住**结果文件必须小于16MB。
或者,你可以打开这样的光标
db.collections.find({ artist: 'some artist', title: 'some title'}, function(err, cursor){ //don't call .toArray()
function handleItem(err, item){
if(item == null) return;
//do stuff...
cursor.nextObject(handleItem);
}
cursor.nextObject(handleItem);
})
这肯定会削减你的迭代器,并且由于每个文档已经小于16 MB,你不必担心聚合文档太大
答案 1 :(得分:2)
解决此问题的理想方法是重新设计架构: 文档架构应如下所示:
{artist:'Of Monsters and Men',
标题:'小谈话',
数据:“重要的事情”
歌曲:[{song1 details},{song2 详情},....]}
这样,您需要访问艺术家的单个文档,检索速度会快得多。