{
"_id" : ObjectId("5c9a31db04a2862329550467"),
"colors" :
[
{
"color" : "(255, 254, 255)",
"value" : 2,
"returnValue" : 2
},
...,
],
"artist" : "Tosa Mitsuoki",
"date" : NaN,
"genre" : "mythological painting",
"style" : "Yamato-e",
"title" : "Night March of a Hundred Demons (left half)",
"fileName" : "colorsearch/img/29855.jpg"
}
db.art_data_full.aggregate( {
"$match" : {
"colors.color" : "(0, 0, 0)"
}
}, {
"$project": {
"_id" : 1,
"fileName": 1,
"artist" : 1,
"date": 1,
"genre": 1,
"style": 1,
"title" : 1,
"colors.returnValue" : 1
}
}, {
"$sort" : {
"colors.value" : -1
}
});
返回colors.value
中的$project
字段时遇到问题。
当前将mongodb和pymongo与django前端一起使用。
“颜色”字段的大小非常大,因为它存储了使用PIL获得的图像中每个像素的rgb值。
colors.color
值是rgb值字符串colors.value
值是图片中出现次数的计数colors.returnValue
值是值的副本我尝试了不同的数据结构方式,但仍在获取错误:
“排序超出了内存限制,达到104857600字节,但未选择>进行外部排序。正在中止操作。传递allowDiskUse:true来选择加入。”
最初,只有“颜色”和“值”,我会得到一个错误,并认为这是因为colors.value是排序字段并引起了问题。
我的想法是将“值”复制到“ returnValue”中,并使用项目获取returnValue并使用值进行排序,但这仍然会导致相同的问题。
如果我只留下colors.returnValue,则查询效果很好,但是我真的很想返回计数以显示在前端。
当前,我正在使用一个键,我尝试了多种组合,这似乎效果很好。
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "art-data.art_data_full"
},
{
"v" : 2,
"key" : {
"colors.color" : -1,
"colors.value" : -1
},
"name" : "colors.color_-1_colors.value_-1",
"ns" : "art-data.art_data_full"
}
]
我不确定allowDiskUse对于解决此问题是否有用。
之前在其他迭代中已经尝试过,它要么仍然给出错误,使mongodb服务器崩溃,要么查询时间过长。
可能需要错误的方式使用它,只是需要一些帮助。
我觉得我已经接近了,但是缺少了一些东西。我搜索了多种途径进行重组等,但是我需要一些帮助。