0

我有一个包含子文档的集合,我正在尝试找到一种简单的方法来获取确切的文档。

{ 
    "_id" : ObjectId("59b0303bfe409a21fccc9523"), 
    "CreatedOn" : ISODate("2017-07-22T15:55:00.000+0000"), 
    "UpdatedOn" : ISODate("2017-07-22T15:55:00.000+0000"), 
    "Guid" : "4F1D7541-FF27-4FEF-9BC4-CF27D2CB92BA", 
    "Company" : "Demo Co.",
    "Departments" : [
        {
            "CreatedOn" : ISODate("2017-07-22T15:55:00.000+0000"), 
            "UpdatedOn" : ISODate("2017-07-22T15:55:00.000+0000"), 
            "Guid" : "D5950FC8-91B1-48A3-8B6A-F3A72FAC9175", 
            "Title" : "Execute" 
        }
    ]
}

我想做的是根据其指南获得某个部门,但到目前为止,我还没有找到任何干净的东西来获得我想要的文档。

我想得到这样的结果:

{
    "CreatedOn" : ISODate("2017-07-22T15:55:00.000+0000"), 
    "UpdatedOn" : ISODate("2017-07-22T15:55:00.000+0000"), 
    "Guid" : "D5950FC8-91B1-48A3-8B6A-F3A72FAC9175", 
    "Title" : "Execute" 
}

我一直在查看 mongodb 文档,但到目前为止没有任何工作,我得到的最接近的是使用 array_search,但如果可能的话,我想直接从 mongo 本身获取它,以避免用 PHP 破解它。

4

3 回答 3

0

也许是这样的: db.collection.find( { "Departments.Guid": "some_value" } ) https ://docs.mongodb.com/manual/tutorial/query-embedded-documents/

于 2017-12-03T22:50:28.030 回答
0

你可以试试这个

db.foo.find({"_id" : ObjectId("59b0303bfe409a21fccc9523")})
.map(function(u){
        return u.Departments
                .filter(p => p.Guid == "D5950FC8-91B1-48A3-8B6A-F3A72FAC9175")
    }
)

这只会返回:

[
    [ 
        {
            "CreatedOn" : ISODate("2017-07-22T21:25:00.000+05:30"),
            "UpdatedOn" : ISODate("2017-07-22T21:25:00.000+05:30"),
            "Guid" : "D5950FC8-91B1-48A3-8B6A-F3A72FAC9175",
            "Title" : "Execute"
        }
    ]
]
于 2017-12-04T05:26:39.483 回答
0

假设 GUID 对于Departments数组中的子文档是唯一的(即查找 GUID 在父文档中仅产生一个可能的匹配项)但 GUID 在其他父文档中可能相同,那么这会产生您寻求的输出结果。如果 GUID 在所有数组和父文档中都是唯一的,那么这也可以。

基本上,我们过滤Departments.Guid= 目标 GUID(下面是“myGUID”)。这给我们留下了一个由 0 或 1 个元素组成的数组,我们从中提取子文档$arrayElemAt,然后将该文档“提升”到作为根文档的位置(而不是将文档分配给命名字段)。如果没有子文档匹配(数组后过滤器的长度为 0),则$arrayElemAt产生 null 并且qq将不存在。我们想在调用之前消除这些文档,$replaceRoot这需要一个真实的现有字段才能提升到根目录。

db.foo.aggregate([
  {$project: { qq: {$arrayElemAt: [
                        { $filter: {
                            input: "$Departments",
                            as: "zz",
                            cond: {$eq: [ "$$zz.Guid", "myGUID" ]}
                            }}
                        , 0] } }}
  ,{$match: { qq: {$exists: true}} }
  ,{$replaceRoot: { newRoot: "$qq"} }
                ]);
于 2017-12-04T00:26:55.503 回答