MongoDB查询文档中的特定字段会返回空文档

MongoDB查询文档中的特定字段会返回空文档,mongodb,Mongodb,对于每个GSM用户,我在服务集合中都有一个文档,我查询的部分如下。由于文档很长,我不得不省略文档的部分并将其分为两个部分,我试图获取documentVerifiedDate,其中documentPurpose和serviceNumber等于特定值: { "_id": ObjectId("59abee12e4b044ce2d6001b6"), "service": { "serviceRequestId": "1335102", "serviceIndex": "S0",

对于每个GSM用户,我在服务集合中都有一个文档,我查询的部分如下。由于文档很长,我不得不省略文档的部分并将其分为两个部分,我试图获取documentVerifiedDate,其中documentPurpose和serviceNumber等于特定值:

{
  "_id": ObjectId("59abee12e4b044ce2d6001b6"),
  "service": {
    "serviceRequestId": "1335102",
    "serviceIndex": "S0",
    "accountIndex": "A0",
    "serviceUser": {
      "isServiceUserSameAsCustomer": "Y",
      "isHolder": "N",
      "isPayer": "N",
      "profileDetails": {
        "identificationDetails": {
          "identificationDetail": [{
              "idType": {
                "masterCode": "PASS"
              },
              "documentPurpose": {
                "masterCode": "POID"
              },
              "idNumber": "9339904299",
              "isReceived": "Y",
              "isVerified": "Y",
              "documentReceivedDate": ISODate("2017-09-05T08:13:25.000+0000"),
              "DMSReferenceNo": "85449499",
              "documentVerifiedDate": ISODate("2017-09-05T08:13:25.000+0000")
            },
            {
              "idType": {
                "masterCode": "REGFORM"
              },
              "documentPurpose": {
                "masterCode": "REGFORM"
              },
              "isUploaded": "Y",
              "isReceived": "Y",
              "isVerified": "Y",
              "documentUploadedDate": ISODate("2017-09-05T08:13:25.000+0000"),
              "DMSReferenceNo": "85449499",
              "documentReceivedDate": ISODate("2017-09-05T08:13:25.000+0000"),
              "documentVerifiedDate": ISODate("2017-09-05T08:13:25.000+0000")
            },
            {
              "idType": {
                "masterCode": "MMS"
              },
              "documentPurpose": {
                "masterCode": "MMS"
              },
              "isUploaded": "Y",
              "isReceived": "Y",
              "isVerified": "Y",
              "documentUploadedDate": ISODate("2017-09-05T08:13:25.000+0000"),
              "DMSReferenceNo": "85449499",
              "documentReceivedDate": ISODate("2017-09-05T08:13:25.000+0000"),
              "documentVerifiedDate": ISODate("2017-09-05T08:13:25.000+0000")
            }
          ]
        },
而且:

"serviceDetails" : {
            "serviceNumberCategory" : {
                "masterCode" : "NORML"
            }, 
            "selfCareAccount" : "Y", 
            "contractDetails" : {
                "startDate" : ISODate("2017-09-03T11:56:58.658+0000"), 
                "endDate" : ISODate("9999-12-31T00:00:00.000+0000")
            }, 
            "technology" : {
                "masterCode" : "GSM"
            }, 
            "starterKitUpdated" : "Y", 
            "relatedProject" : "", 
            "businessType" : {
                "masterCode" : "Prepaid"
            }, 
            "mobileMoneyAccount" : "Y", 
            "activatedVia" : {
                "masterCode" : "SP"
            }, 
            "serviceType" : {
                "masterCode" : "GSM"
            }, 
            "subServiceType" : {
                "masterCode" : "Voice"
            }, 
            "serviceNumber" : "9339904299", 
            "simDetails" : {
我已经编写了下面的查询来获取documentVerifiedDate,其中documentPurpose是POID,serviceNumber是9339904299:

db.Service.find ({
        "service.serviceDetails.serviceNumber": "9339902499",
        "service.serviceUser.profileDetails.identificationDetails.identificationDetail.0.documentPurpose.masterCode" : "POID"
    }, 
    {
        "service.serviceUsear.profileDetails.identificationDetails.identificationDetail.0.documentVerifiedDate" : 1,
         _id: 0
    })
我得到的结果如下:

{ 
    "service" : {

    }
}
如果您能帮助我理解为什么上述查询无法达到预期目的,即documentVerifiedDate未返回,我将不胜感激

我使用了下面的链接来编写查询。

$elemMatch、$slice和$s是实现特定项目的唯一方法 要包含在返回数组中的元素。例如,你不能 使用数组索引项目特定的数组元素;e、 g{ instock.0:1}投影将不会使用第一个 元素

使用$positional操作符

差不多

db.Service.find ({
    "service.serviceDetails.serviceNumber": "9339904299",
    "service.serviceUser.profileDetails.identificationDetails.identificationDetail.documentPurpose.masterCode": "POID"
  },
  {
    "service.serviceUser.profileDetails.identificationDetails.identificationDetail.$": 1
  })
这将为您提供匹配的identificationDetail对象,您可以使用文档中的documentVerifiedDate


注意:查询中的serviceNumber与提供的文档不匹配。我已将查询调整为使用文档中的serviceNumber。

谢谢Veeram,因此将返回一个对象,其字段稍后可以访问。我问这个问题是因为我需要在Python中使用它,因为它返回了一个列表,我使用迭代器访问documentVerifiedDate,而如果只返回documentVerifiedDate,我就可以跳过那些迭代或dictionary access.Np。您可以使用findOne返回对象。其他不需要的选项是使用聚合将结果转换为返回documentVerifiedDate。