【问题标题】:Get specific object in array of array in MongoDB获取MongoDB数组数组中的特定对象
【发布时间】:2014-12-04 10:38:57
【问题描述】:

我需要在 MongoDB 的数组数组中获取特定对象。

我只需要获取任务 object = [_id = ObjectId("543429a2cb38b1d83c3ff2c2")]。

我的文档(项目):

{
    "_id" : ObjectId("543428c2cb38b1d83c3ff2bd"),
    "name" : "new project", 
    "author" : ObjectId("5424ac37eb0ea85d4c921f8b"),
    "members" : [ 
        ObjectId("5424ac37eb0ea85d4c921f8b")
    ],
    "US" : [ 
        {
            "_id" : ObjectId("5434297fcb38b1d83c3ff2c0"),
            "name" : "Test Story",
            "author" : ObjectId("5424ac37eb0ea85d4c921f8b"),
            "tasks" : [ 
                {
                    "_id" : ObjectId("54342987cb38b1d83c3ff2c1"),
                    "name" : "teste3", 
                    "author" : ObjectId("5424ac37eb0ea85d4c921f8b")
                }, 
                {
                    "_id" : ObjectId("543429a2cb38b1d83c3ff2c2"),
                    "name" : "jklasdfa_XXX", 
                    "author" : ObjectId("5424ac37eb0ea85d4c921f8b")
                }
            ]
        }
    ]
}

预期结果:

{
    "_id" : ObjectId("543429a2cb38b1d83c3ff2c2"),
    "name" : "jklasdfa_XXX", 
    "author" : ObjectId("5424ac37eb0ea85d4c921f8b")
}

但我不明白。 我仍然没有成功测试:

db.projects.find({        
       "US.tasks._id" : ObjectId("543429a2cb38b1d83c3ff2c2")        
    }, { "US.tasks.$" : 1 })

我也尝试过使用 $elemMatch,但没有返回任何内容。

db.projects.find({     
        "US" : {
            "tasks" : {
                $elemMatch : { 
                    "_id" : ObjectId("543429a2cb38b1d83c3ff2c2")                        
                }              
            }
        }     
})

我可以使用 find() 仅获得预期的结果吗?如果没有,什么以及如何使用?

谢谢!

【问题讨论】:

    标签: mongodb nosql


    【解决方案1】:

    为此,您需要aggregation:

    db.projects.aggregate([{$unwind:"$US"},
                           {$unwind:"$US.tasks"},
                           {$match:{"US.tasks._id":ObjectId("543429a2cb38b1d83c3ff2c2")}},
                           {$project:{_id:0,"task":"$US.tasks"}}])
    

    应该返回

    { task : {
        "_id" : ObjectId("543429a2cb38b1d83c3ff2c2"),
        "name" : "jklasdfa_XXX", 
        "author" : ObjectId("5424ac37eb0ea85d4c921f8b")
    }
    

    解释:

    • $unwind 为每个数组元素创建一个新的(虚拟)文档
    • $match 是您查找的查询部分
    • $project 类似于 find 中的项目部分,即它指定您希望在结果中获得的字段

    如果您知道要搜索的文档,您可能希望在 $unwind 之前添加第二个 $match(查看性能指标)。


    编辑:添加第二个$unwind,因为US 是一个数组。

    不知道你在做什么(所以真的不能告诉,只是建议),但你可能想检查你的架构(和 mongodb)是否适合你的任务,因为文档看起来就像非规范化的关系数据可能关系数据库更适合您。

    【讨论】:

    • 很棒的解释和提示!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多