mongoDB映射/还原

mongoDB映射/还原,mongodb,mapreduce,mongodb-query,nosql,Mongodb,Mapreduce,Mongodb Query,Nosql,我试图在mongoDB中找到这个map/reduce系统。我的收藏中有以下基本模式/布局 { _id: 1, name: n1, website: w1, tags: [ myTag1, myTag3 ] } { _id: 2, name: n2, website: w2, tags: [ myTag2, myTag3 ] } { _id:

我试图在mongoDB中找到这个map/reduce系统。我的收藏中有以下基本模式/布局

{
    _id: 1,
    name: n1,
    website: w1,
    tags: [
        myTag1,
        myTag3
    ]
}

{
    _id: 2,
    name: n2,
    website: w2,
    tags: [
        myTag2,
        myTag3
    ]
}

{
    _id: 3,
    name: n3,
    website: w3,
    tags: [
        myTag2,
        myTag4
    ]
}
如何检索唯一标记的数组?我想这是返回给我进一步使用

{
    tags: [
        myTag1,
        myTag2,
        myTag3,
        myTag4
    ]
}
顺便说一句,这是我想到的,但它只返回每个项目的_id和标记,而不是将标记组合到单个对象中

var map = function() {emit( this._id,{tags: this.tags});};

var reduce = function(key, values) {
    var t = [];

    values.forEach(function(doc) {
        var tags = doc.tags;
        tags.forEach(function(tag) {
            if (!(tag in t)) {
                t.push(tag);
            }
        });
    });

    return {tags: t};
};

var op = db.businesses.mapReduce(map, reduce, {out: "mr_results"});

db[op.result].find();

在您的情况下,不需要使用map reduce。只需使用distinct函数:

db.businesses.distinct('tags')
您可以在mongo shell中尝试:

> use test
switched to db test
> db.businesses.insert({tags: ['tag1', 'tag2']})
> db.businesses.insert({tags: ['tag3', 'tag4']})
> db.businesses.find()
{ "_id" : ObjectId("4fa05b2b036495bf4ac9c0cc"), "tags" : [ "tag1", "tag2" ] }
{ "_id" : ObjectId("4fa05b33036495bf4ac9c0cd"), "tags" : [ "tag3", "tag4" ] }

> db.businesses.distinct('tags')
[ "tag1", "tag2", "tag3", "tag4" ]

另外,您应该记住MongoDB中的map/reduce不适合实时查询。

在您的情况下不需要使用map-reduce。只需使用distinct函数:

db.businesses.distinct('tags')
您可以在mongo shell中尝试:

> use test
switched to db test
> db.businesses.insert({tags: ['tag1', 'tag2']})
> db.businesses.insert({tags: ['tag3', 'tag4']})
> db.businesses.find()
{ "_id" : ObjectId("4fa05b2b036495bf4ac9c0cc"), "tags" : [ "tag1", "tag2" ] }
{ "_id" : ObjectId("4fa05b33036495bf4ac9c0cd"), "tags" : [ "tag3", "tag4" ] }

> db.businesses.distinct('tags')
[ "tag1", "tag2", "tag3", "tag4" ]
另外,您应该记住,MongoDB中的map/reduce不适合实时查询。

使用它,您可以按如下方式执行:

函数m{ this.tags.forEachfunctionx{emit'tag',x;}; } 函数rk,v{ var res={}; v、 forEachfunctionx{res[x]=true;}; 返回res; } db.business.mapReducem,r,{out:'out'}; //现在,“out”集合有一个记录,其value属性 //具有源集合中每个标记的键。 函数getTagscoll{ var tags=[],o=db[coll]。查找[0]。值; 对于o{tags.pushi}中的var i 返回标记;//与Object.keysdb[coll]相同。查找[0]。值 } listTags'out';//=>['myTag1','myTag2','myTag3','myTag4'] 您可以使用以下方法进行操作:

函数m{ this.tags.forEachfunctionx{emit'tag',x;}; } 函数rk,v{ var res={}; v、 forEachfunctionx{res[x]=true;}; 返回res; } db.business.mapReducem,r,{out:'out'}; //现在,“out”集合有一个记录,其value属性 //具有源集合中每个标记的键。 函数getTagscoll{ var tags=[],o=db[coll]。查找[0]。值; 对于o{tags.pushi}中的var i 返回标记;//与Object.keysdb[coll]相同。查找[0]。值 } listTags'out';//=>['myTag1','myTag2','myTag3','myTag4']
结果是[[myTag1,myTag3],[myTag2,myTag3],[myTag2,myTag4]]我需要[[myTag1,myTag2,myTag3,myTag4]]嗯,奇怪。我发布了一个来自mongo shell的更新示例,可能会有所帮助。这很奇怪,我的更新根本不符合该示例显示的您使用哪个版本的MongoDB?我只是复制/粘贴了该示例中的每一行,结果是[[tag1,tag2],[tag3,tag4]],结果是[[myTag1,myTag3],[myTag2,myTag3],[myTag2,myTag4]]我需要[[myTag1,myTag2,myTag3,myTag4]]嗯,很奇怪。我发布了一个来自mongo shell的更新示例,可能会有所帮助。这很奇怪,我的更新根本不符合该示例所显示的,您使用哪个版本的MongoDB?我只是复制/粘贴了该示例中的每一行,结果是[[tag1,tag2],[tag3,tag4]]