我有一个 MongoDB 集合,其中包含一个颜色数组,如:
我的收藏:
{
_id : ...,
"colours" : [
{
"colourpercentage" : "42",
"colourname" : "Blue"
},
{
"colourpercentage" : "32",
"colourname" : "Red"
},
{
"colourpercentage" : "10",
"colourname" : "Green "
}
]
}
我想检索此集合中每个条目的每个不同颜色名称,并能够通过搜索对其进行过滤。
我尝试了 distinct 但没有成功。我进一步搜索,发现聚合可以帮助我。目前我有:
db.getCollection('myCollection').aggregate([
{ "$match": { "colours.colourname": /Gre/ } }, # Gre is my search
{ "$unwind": "$colours" },
{ "$match": { "colours.colourname": /search/ } },
{ "$group": {
"_id": "$colours.colourname"
}}
])
它正在工作,但我得到一个像这样的数组:
{
"result" : [
{
"_id" : "Grey"
},
{
"_id" : "Light Green "
},
{
"_id" : "Light Green"
},
{
"_id" : "Green "
},
{
"_id" : "Green"
}
],
"ok" : 1.0000000000000000
}
我想删除末尾有空格的重复条目并将它们显示为:
["Grey","Light Green","Green"]
最佳答案
您可以采用的一种方法是 Map-Reduce 方式,即使 JavaScript 解释器驱动 mapReduce 比聚合框架花费的时间稍长,但可以正常工作,因为您将使用聚合框架中缺少的一些非常有用的 native JavaScript 函数。例如,在 map 函数中,您可以使用 trim()
函数删除 colourname
字段中的所有尾随空格,以便您可以发出“已清理”的键。
Map-Reduce 操作通常具有以下 map 和 reduce 函数:
var map = function() {
if (!this.colours) return;
this.colours.forEach(function (c){
emit(c.colourname.trim(), 1)
});
};
var reduce = function(key, values) {
var count = 0;
for (index in values) {
count += values[index];
}
return count;
};
db.runCommand( { mapreduce : "myCollection", map : map , reduce : reduce , out : "map_reduce_result" } );
然后您可以使用正则表达式查询 map_reduce_result
集合以获得结果:
var getDistinctKeys = function (doc) { return doc._id };
var result = db.map_reduce_result.find({ "_id": /Gre/ }).map(getDistinctKeys);
print(result); // prints ["Green", "Grey", "Light Green"]
-- 更新 --
为了在 Python 中实现这一点,PyMongo 的 API 支持 MongoDB 的 map/reduce 引擎的所有功能,因此您可以尝试以下操作:
import pymongo
import re
from bson.code import Code
client = pymongo.MongoClient("localhost", 27017)
db = client.test
map = Code("function () {"
" if (!this.colours) return;"
" this.colours.forEach(function (c){"
" emit(c.colourname.trim(), 1)"
" });"
"};")
reduce = Code("function (key, values) {"
" var count = 0;"
" for (index in values) {"
" count += values[index];"
" }"
" return count;"
" };")
result = db.myCollection.map_reduce(map, reduce, "map_reduce_result")
regx = re.compile("Gre", re.IGNORECASE)
for doc in result.find({"_id": regx}):
print(doc)
关于mongodb - 不同/聚合查询 Mongodb 数组,修剪尾随空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30438761/