在MongoDB中获取数组数组中的特定对象

时间:2014-10-09 13:17:31

标签: mongodb nosql

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

我只需要获取任务对象= [_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()获得预期的结果?如果没有,用什么和如何使用?

谢谢!

1 个答案:

答案 0 :(得分:0)

您需要aggregatio n:

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中的项目部分类似,即它指定了您希望在结果中获得的字段

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


修改:添加了第二个$unwind,因为US是一个数组。

不知道你在做什么(所以真的无法分辨并且只是sugesting)但你可能想要检查你的架构(和mongodb)是否适合你的任务,因为该文档看起来就像非规范化的关系数据关系数据库对你来说会更好。