mongodb - 如何只返回选定的几个嵌入对象的对象?

标签 mongodb mapreduce aggregation-framework

我的结构如下:

{
    day: x,
    events:
    [
        {
            year: y,
            info: z
        }
    ]
}

到目前为止,我创建了以下查询,我没有返回错误但也显示了任何内容(这是错误的)。

db.days.aggregate([
{ 
    $match: 
    {
        $and:
        [ 
            {
                'day': 'March_13' 
            },
            {
                'events.year': '1870'
            },
            {
                'events.info': {$regex: "./French./"}
            }
        ]
    }
},
{
    $unwind: {path: "$events"},
},
{ 
    $match: 
    {
        'info': { $regex: '.*French.*'}
    }
}])

根据我的阅读,我需要按 _id 分组,但我不知道如何用满足第二个 $match 的对象重新创建数组。

能否请您看看并告诉我为什么初始查询不起作用,并在组 block 上给我建议?

一些示例数据在这里:

{ 
    "day" : "March_13", 
    "events" : 
         [
             { 
                 "year" : "1929", 
                 "info" : "Peter Breck, American actor (d. 2012)" 
             }, 
             { 
                 "year" : "1929", 
                 "info" : "Joseph Mascolo, American actor" 
             }, 
             { 
                 "year" : "1929", 
                 "info" : "Zbigniew Messner, Polish economist and politician, 9th Prime Minister of the Republic of Poland (d. 2014)" 
             }, 
             { 
                 "year" : "1929", 
                 "info" : "Bunny Yeager, American model and photographer (d. 2014)" 
             }
         ] 
}

下面是我是否可以通过“American”这个词成功查询:

{ 
    "day" : "March_13", 
    "events" : 
         [
             { 
                 "year" : "1929", 
                 "info" : "Peter Breck, American actor (d. 2012)" 
             }, 
             { 
                 "year" : "1929", 
                 "info" : "Joseph Mascolo, American actor" 
             }, 
             { 
                 "year" : "1929", 
                 "info" : "Bunny Yeager, American model and photographer (d. 2014)" 
             }
         ] 
}

基本上我想检查字段信息是否包含搜索到的词,如果包含我将其保存在数组中。

最佳答案

您想要尝试为上述示例运行以下聚合管道以获得所需的结果:

db.days.aggregate([
    {
        "$match": {
            "day" : "March_13",
            "events.year": "1929",
            "events.info": /American/
        }
    },
    { "$unwind": "$events" },
    {
        "$match": {
            "day" : "March_13",
            "events.year": "1929",
            "events.info": /American/
        }
    },
    {
        "$group": {
            "_id": "$_id",
            "day": { "$first": "$day" },
            "events": { "$push": "$events" }
        }
    }

])

示例输出

/* 0 */
{
    "result" : [ 
        {
            "_id" : ObjectId("5706b38dcc578484faab815f"),
            "day" : "March_13",
            "events" : [ 
                {
                    "year" : "1929",
                    "info" : "Peter Breck, American actor (d. 2012)"
                }, 
                {
                    "year" : "1929",
                    "info" : "Joseph Mascolo, American actor"
                }, 
                {
                    "year" : "1929",
                    "info" : "Bunny Yeager, American model and photographer (d. 2014)"
                }
            ]
        }
    ],
    "ok" : 1
}

关于mongodb - 如何只返回选定的几个嵌入对象的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36484796/

相关文章:

c - 在等效数组之间分配元素以实现平衡和

mongodb - 包含多个字段的组,但将字段视为相等

mongodb - 在嵌套数组中查找第一个符合条件的元素

node.js - 根据类型 y 分组的字段 x 的前 1 个返回 mongoDB 中的记录

node.js - TypeError : Grid is not a constructor. Mongodb Node 驱动

mongodb - NoSQL 最佳实践

mongodb - 在 MongoDb 中使用 mapreduce 计算平均值

hadoop - Hadoop CouchDB Elasticsearch

java - Hadoop reducer 上的奇怪行为

linux - 如何从 EC2 上的根卷创建 XFS 卷?