mongodb - 不同/聚合查询 Mongodb 数组,修剪尾随空间

标签 mongodb nosql

我有一个 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/

相关文章:

javascript - 我可以在 CouchDB 中存储对象数组吗?

mongodb - 如何在我的 map/reduce 函数中调用 mongodb?这是一个好习惯吗?

full-text-search - 键值存储数据库是全文搜索存储的好选择吗?

mongodb - NoSQL 中的博客和博客评论关系

java - 从java搜索时Mongo Id被_id覆盖

mongodb - 哪种 NoSQL DB 最适合 OLTP 金融系统?

nosql - 京都内阁和多个进程?

javascript - 从 mongodb id 获取时间戳

node.js - 唯一和稀疏模式级索引 MongoDB 和 Mongoose

javascript - Node + MongoDB 问题 EADDRINUSE