Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用MongoDB在多个文档之间获取数组的公共值?_Mongodb_Aggregation Framework - Fatal编程技术网

如何使用MongoDB在多个文档之间获取数组的公共值?

如何使用MongoDB在多个文档之间获取数组的公共值?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,鉴于这些文件: { values: [ { attribute: 1 }, { attribute: 2 }, { attribute: 3 }, { attribute: 4 }, ] }, { values: [ { attribute: 2 }, { attribute: 3 }, { attribute: 4 }, ] }, { valu

鉴于这些文件:

{
    values: [
        { attribute: 1 },
        { attribute: 2 },
        { attribute: 3 },
        { attribute: 4 },
    ]
},
{
    values: [
        { attribute: 2 },
        { attribute: 3 },
        { attribute: 4 },
    ]
},
{
    values: [
        { attribute: 2 },
        { attribute: 3 },
    ]
}
我正在尝试获取常见的“属性”值:

我正在研究聚合器框架,但目前还没有找到任何能够真正满足我需求的东西

我正在使用Mongo2.4.6

提前感谢您的回答

编辑

事实上,我的文档可以有重复的属性(但我希望每个文档只计算一次属性)

鉴于这些数据

{
    values: [
        { attribute: 1 },
        { attribute: 2 },
        { attribute: 3 },
        { attribute: 3 },
        { attribute: 4 },
    ]
},
{
    values: [
        { attribute: 2 },
        { attribute: 2 },
        { attribute: 3 },
        { attribute: 4 },
    ]
},
{
    values: [
        { attribute: 2 },
        { attribute: 3 },
    ]
}
然后查询应返回:

{
        "result" : [
                {
                        "values" : 2
                },
                {
                        "values" : 3
                }
        ],
        "ok" : 1
}
Anand,您发布的查询将对属性“2”计数4次,而不是3次。 我试图修改它,但这对我来说仍然很神秘


提前谢谢。

我不确定我是否完全理解了你的问题,但我要试一试

如果只想查找集合中每个文档中存在的属性,一种方法是在单独的查询中获取文档计数,然后使用如下聚合查询

db.collection.aggregate([
//展开值数组
{“$unwind”:“$values”},
//按“values.attribute”分组并获取每个属性的计数
{“$group”:{U id:$values.attribute”,计数:{$sum:1}},
//仅过滤计数等于集合中的文档数(即3)的文档
{“$match”:{count:3}},//用文档计数替换3
//项目阶段,使结果更美观,并以您想要的格式显示
{“$project”:{U id:0,值:“$\U id”}
])
这是运行上述查询时将获得的输出:

{
“结果”:[
{
“价值观”:3
},
{
“价值观”:2
}
],
“好”:1
}
但是,我不认为这可以在单个查询中实现(即,不运行单独的文档计数查询)。如果有更好的方法,可能会有人在这里发帖

编辑:对于您描述的边缘案例,您可以利用每个文档中存在的
\u id
字段,通过添加额外的$group阶段,包括
\u id
,该字段在整个集合中是唯一的:

db.collection.aggregate([
//展开值数组
{“$unwind”:“$values”},
//按“_id”和“values.attribute”分组,以便从每个文档的数组中仅选择一个元素
{“$group”:{{U id:{{U id:$id”,属性值:$values.attribute}},
//按“values.attribute”分组并获取每个属性的计数
{“$group”:{U id:$id.attrValue”,计数:{$sum:1}},
//仅过滤计数等于集合中的文档数(即3)的文档
{“$match”:{count:3}},//用文档计数替换3
//项目阶段,使结果更美观,并以您想要的格式显示
{“$project”:{U id:0,值:“$\U id”}
])

我们提出了以下解决方案:

db.collection.aggregate(
{$project:{“values.attribute”:1}},
{$unwind:“$values”},
{$group:{
_id:“$\u id”,
属性:{$addToSet:“$values.attribute”}
}
},
{$unwind:“$attribute”},
{$group:{{U id:“$attribute”,计数:{$sum:1}},
{“$match”:{count:3},
)
addToSet似乎比组合键上的组更快


非常感谢你,非常感谢你的帮助

你说的“公共”属性值到底是什么意思?是否要查找集合中每个文档中存在的属性?例如,4出现在第1和第2个文档中。这算普通吗?你好,阿南德。不,我的意思是属性必须存在于所有文档中。因此,在这个例子中,只有属性2和3必须被选择。我已经发布了一个解决方案。看看你是不是在找。你好,阿南德。非常感谢您的回答!它满足了我的需求,但我已经忘记了一个边缘案例,它会很快改变请求。我已经更新了初始问题以向您展示它。我已经为edge base添加了另一个查询。希望有帮助!
{
        "result" : [
                {
                        "values" : 2
                },
                {
                        "values" : 3
                }
        ],
        "ok" : 1
}