我有专辑数据库 每个文件看起来都是那样
{
"_id" : ObjectId("576a569a32f844c021019533"),
"genres" : [
"Rock",
"Funk / Soul",
"Blues"
],
"artistJoins" : [
{
"artist_name" : "Citizen Cope"
}
],
"title" : "Bullet And A Target",
"tracklist" : [
{
"duration" : "4:22",
"position" : "A",
"title" : "Bullet And A Target"
},
{
"duration" : "3:22",
"position" : "A",
"title" : "Unfaithful"
}
]
}
我正在尝试获取每个文档的tracklist项目 所以我最终会有一个tracklist项目和艺术家名称列表(来自artistJoins [0] .artist_name) db真的很像1000000文件
我做了一些有用的东西,它很快(也许我错了)
这是我试过的
db.collection('releases').aggregate( [
{ $sample: {size: 100}},
{ $unwind : {path:"$tracklist" ,preserveNullAndEmptyArrays: false,includeArrayIndex: "songposition" } },
{ $match: { $or: [{ genres: 'Rock' }, { genres: 'Hip Hop' }] }},
{ $project: {"_id":0,"tracklist": 1,"songposition":1, "artistJoins":1}}
] , function(err, result) {
callback(result);
});
这个例子花了我大约1400毫秒(它快吗?) 顺便说一下这些类型可以改变,但每个类型至少有100个结果,所以不是数据库中没有足够的数据 该查询的问题在于,有时候他会减少100个跟踪列表,有时甚至更多 使用艺术家姓名获取随机100个曲目列表项目的最佳解决方案是什么 例如,在本文档中,我将获得此列表
(顺便说一句,这就是我现在所得到的,但有时它不到100,有时更多)
[
{
"atrist_name" : "Citizen Cope",
"tracklist" :{
"duration" : "4:22",
"position" : "A",
"title" : "Bullet And A Target"
}
},
{
"atrist_name" : "Citizen Cope",
"tracklist" :{
"duration" : "3:22",
"position" : "A",
"title" : "Unfaithful"
}
}
]
并为所有其他文件这样做,直到我得到100
的列表希望我能得到更好的解决方案,甚至更快或至少不会更慢 希望我很清楚,如果不是只是告诉我,我会更新