我希望在一个集合中检索我的集合的所有值:
示例:
` "_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)的所有值到一个集合?
谢谢
答案 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来设置两个集合的联合。