从文档获取子文档

时间:2017-12-03 22:45:23

标签: mongodb php-7.2

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

{ 
    "_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攻击它。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

假设GUID对Departments数组中的subdoc是唯一的(即查找GUID只能在父文档中产生一个可能的匹配)但GUID可能与其他父文档相同,那么这会产生你寻求的输出结果。如果GUID在所有阵列和父文档中都是唯一的,那么这也是有用的。

基本上,我们过滤Departments.Guid =目标GUID(下面是“myGUID”)。这给我们留下了一个0或1个元素的数组,我们用$arrayElemAt从中提取子文件,然后将该文档作为根文档“提升”到位(而不是将文档分配给命名字段)。如果没有subdoc匹配(数组post-filter的长度为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"} }
                ]);

答案 2 :(得分:0)

你可以试试这个,

[
    [ 
        {
            "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"
        }
    ]
]

这只会返回:

angular.module('conFusion.services', ['ngResource'])
        .constant("baseURL","http://localhost:3000/")
        .service('menuFactory', ['$http', '$resource', 'baseURL', function($http, $resource,baseURL) {