过滤器与嵌入式文档的一致应用

时间:2017-11-15 15:36:51

标签: mongodb mongodb-query aggregation-framework

我是mongodb /

的新手

我需要使用mongo shell获取一个文件,如果它的第一个emdedded文档与条件A相匹配,则会将编码B复制。

例如,我只收集了一个文档:

{
"_id": "life",
"docs": [{
    "_id": "sex",
    "p": 2,
    "c": 2
}, {
    "_id": "drugs",
    "p": 1,
    "c ": 2
}, {
    "_id": "rock'n'roll",
    "p": 1,
    "c": 4
}]

}

如果条件是p = 1,那么

----如果B条件是с= 2,我得到“生命”(嵌入式文档“药物”符合条件)

----如果B条件是c = 4,我得到空结果。

如果条件是c = 2,那么

----如果B条件是p = 2,我得到“生命”(emdedded doc“sex”符合条件)

----如果B条件是p = 1,我得到空结果(

TNX

加了:

任务是根据以特定方式应用于emdedded文档的条件来过滤集合并获取整个文档,因此我认为这个问题并不重复。

但在that question的帮助下,我得到了解决方案:

db.test.aggregation([
{
    $project:
    {
        docs:
        {
            $filter:
            {
                input:"$docs",
                as:"doc",
                cond:{$eq:['$$doc.p',1]}
            }
        }
    }
},
{
    $project:
    {
        docs:{$slice:["$docs",1]}
    }
},
{
    $project:
    {
        docs:
        {
            $filter:
            {
                input:"$docs",
                as:"doc",
                cond:{$eq:['$$doc.c',2]}
            }
        }
    }
},
{
    $project:
    {
        "docs":1, 
        "n":{"$size":"$docs"}
    }
},
{
    $match:{"n":{$gt:0}}
}])

另一种解决方案:

db.c.aggregate([
{
    $project:
    {
        docs:
        {
            $filter:
            {
                input:"$docs",
                as:"doc",
                cond:{$eq:['$$doc.p',1]}
            }
        }
    },
},
{
    "$unwind":"$docs"
},
{ 
    "$group": 
    {
        "_id": "$_id",
        "doc": { "$first": "$docs" }
    }
},
{
    $match:{"doc.c":2}
}])

1 个答案:

答案 0 :(得分:0)

所以你的意思是你想从数组中提取值并将它呈现在“平面”结构中?

如果这是你的意思,你需要这样的东西:

db.collectionName.aggregate([
{
  $match: {
    "docs.p": 1,
    "docs.c": 2
  }
},
{ $unwind: "$docs"},
{
  $match: {
    "docs.p": 1,
    "docs.c": 2
  }
}
])

基本上我会$match两次。在第一个中,您匹配包含这些值的所有文档。然后你$unwind“扁平”你的阵列结构。最后一步,我再次使用$match来获取您实际需要的集合。