在子文档中搜索

Search in subdocument

您好,我想获取联系人对象中所有syncFlag为true的联系人。

我也试过这个解决方案 returns 所有文档都匹配或不匹配

How to find document and single subdocument matching given criterias in MongoDB collection

这是示例文档

{
    "_id" : ObjectId("57ce7d6c7387d533bfa2d45c"),
    "ITBCompanyId" : 2608,
    "updatedAt" : ISODate("2016-09-06T12:19:35.972Z"),
    "createdAt" : ISODate("2016-09-06T08:25:16.325Z"),
    "name" : "This is test",
    "identifier" : "THDNOM2",
    "addressLine1" : "Valencia Lahore",
    "syncFlag" : true,
    "orgId" : "1",
    "deletedAt" : null,
    "whois" : [ 
        {
            "test" : "noman"
        }
    ],
    "configuration" : [ 
        {
            "test" : "noman"
        }
    ],
    "contact" : [ 
        {
            "firstName" : "Active",
            "_id" : ObjectId("57ceb04811f005420b7ed54a"),
            "syncFlag" : false,
            "communicationItems" : [],
            "customFields" : []
        }, 
        {
            "firstName" : "Active",
            "_id" : ObjectId("57ceb04811f005420b7ed54b"),
            "syncFlag" : false,
            "communicationItems" : [],
            "customFields" : []
        }, 
        {
            "firstName" : "Active",
            "_id" : ObjectId("57ceb44b5f8b534bc312aacd"),
            "syncFlag" : true,
            "communicationItems" : [],
            "customFields" : []
        }, 
        {
            "firstName" : "Active",
            "_id" : ObjectId("57ceb457f141fd4c1c98a748"),
            "syncFlag" : true,
            "communicationItems" : [],
            "customFields" : []
        }
    ],
    "agreement" : [ 
        {
            "test" : "noman"
        }
    ],
    "companySite" : [ 
        {
            "test" : "noman"
        }
    ],
    "companyNote" : [ 
        {
            "test" : "noman"
        }
    ],
    "type" : {
        "name" : "Client"
    },
    "status" : {
        "name" : "Active"
    },
    "id" : "19493",
    "__v" : 0,
    "_info" : {
        "updatedBy" : "Omer",
        "lastUpdated" : ISODate("2016-09-06T11:52:07.000Z")
    }
}

预期输出:

 ITBCompanyId: 1,
    contact: [{
               "firstName" : "Active",
                "_id" : ObjectId("57ceb04811f005420b7ed54b"),
                "syncFlag" : true,
                "communicationItems" : [],
                "customFields" : []

    }]

试试这个。您应该按要求获得文件。下面我使用聚合查询来根据需要格式化 mongodb 响应。有关 mongodb 聚合的更多信息,您可以参考 this. I reffered this 堆栈溢出 post 以形成此查询。

db.companies.aggregate(
    { $match: {"contact.syncFlag": true }},
    { $unwind: '$contact'},
    { $match: {"contact.syncFlag": true }},
    { $group: { 
            _id: '$_id',  
            contact: {$push: '$contact'},
    }
});

如果您希望文档中包含所有其他字段。你可以试试这个。

db.companies.aggregate(
    { $match: {"contact.syncFlag": true }},
    { $unwind: '$contact'},
    { $match: {"contact.syncFlag": true }},
    { $group: { 
        _id: '$_id', 
        ITBCompanyId: {$first: '$ITBCompanyId'}, 
        updatedAt: {$first: '$updatedAt'}, 
        createdAt: {$first: '$createdAt'}, 
        name: {$first: '$name'}, 
        identifier: {$first: '$identifier'}, 
        addressLine1: {$first: '$addressLine1'}, 
        syncFlag: {$first: '$syncFlag'}, 
        orgId: {$first: '$orgId'}, 
        deletedAt: {$first: '$deletedAt'}, 
        whois: {$first: '$whois'}, 
        configuration: {$first: '$configuration'}, 
        contact: {$push: '$contact'},
        agreement: {$first: '$agreement'},
        companySite: {$first: '$companySite'},
        companyNote: {$first: '$companyNote'},
        type: {$first: '$type'},
        status: {$first: '$status'},
        id: {$first: '$id'},
        _info: {$first: '$_info'},
    }
});