在mongodb中检索集合的所有值

时间:2016-04-24 08:05:55

标签: string mongodb attributes field

我希望在一个集合中检索我的集合的所有值:

示例:

` "_id" : {
        "origin" : "xx",
        "destination" : "yy"
    },
    "paths" : [ 
        [ 
            "tt"
        ]
    ]
}

/* 2 */
{
    "_id" : {
        "origin" : "aa",
        "destination" : "bb"
    },
    "paths" : [ 
        [ 
            "cc"
        ]
    ]

}

/* 3 */
{
    "_id" : {
        "origin" : "xy",
        "destination" : "yx"
    },
    "paths" : [ 
        [ 
            "yy", 
            "tt", 
            "cc"
        ]
    ]

}`

预期产出:

Nodes : {"xx", "yy", "aa", "bb","xy", "yx"}

我尝试了$setUnion,但它不起作用,因为我有字符串

$addToset

无法添加两个字段:“origin”和“destination”

如何检索我的集合的字段(id.origin和id.destination)的所有值到一个集合?

谢谢

2 个答案:

答案 0 :(得分:2)

由于这是一个非常特殊的情况,你想要自定义格式,你最好的选择是MongoDB的map-reduce功能。但是,这种格式化也可以通过聚合框架来实现。我正在添加两种解决方案。

聚合框架:

db.collection.aggregate([
  {
    $group:{
      _id:null, 
      origin:{
        $addToSet:"$_id.origin"
      }, 
      destination:{
        $addToSet:"$_id.destination"
      }
  }},
  {
    $project:{
      _id:0, 
      Nodes:{
        $setUnion:["$origin","$destination"]
      }
  }}
])

输出:

{ 
    "Nodes" : [
        "yy", 
        "yx", 
        "xx", 
        "bb", 
        "aa", 
        "xy"
    ]
}

Map Reduce:

db.collection.mapReduce(
    function () {
        emit(1, this._id);
    },
    function (key, values) {
        var o = {};
        o.Nodes = [];

        for (var i = 0; i < values.length; i++) {
            o.Nodes.push(values[i].origin);
            o.Nodes.push(values[i].destination);
        }

        return o;
    },
    {
        out: { inline: 1 }
    });

输出:

{ 
    "results" : [
        {
            "_id" : NumberInt(1), 
            "value" : {
                "Nodes" : [
                    "xx", 
                    "yy", 
                    "aa", 
                    "bb", 
                    "xy", 
                    "yx"
                ]
            }
        }
    ], 
    "timeMillis" : NumberInt(22), 
    "counts" : {
        "input" : NumberInt(3), 
        "emit" : NumberInt(3), 
        "reduce" : NumberInt(1), 
        "output" : NumberInt(1)
    }, 
    "ok" : NumberInt(1)
}

results.values.Nodes包含您想要的结果。

答案 1 :(得分:1)

在聚合管道中,首先你可以有两个集合(Originset和DestinationSet),之后你可以使用setUnion来设置两个集合的联合。