Невозможно получить данные из коллекции MongoDB с использованием Golang - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь получить запись в соответствии с некоторым значением фильтра, используя MongoDB и GoLang, но возвращающие нулевые данные. Я объясняю свою запись json ниже.

{
    "OrderNumber" : "EQORD/20/10001060",
    "OrderStatus" : "Pending",
    "OrderType" : "Online",
    "Comments" : "",
    "DispatchPriority" : "High",
    "Customer" : {
        "CustomerID" : "5e4e2ee2a060bd3d31af431b",
        "CustomerFirstName" : "Chehan",
        "CustomerLastName" : "Kumar",
        "CustomerMobile" : "9886688726",
        "CustomerAlternateMobile" : "",
        "CustomerEmail" : "way2chethan@live.com",
        "CustomerType" : "Parent",
        "Children" : [ 
            {
                "StudentAdmissionID" : "10021920086",
                "StudnetFirstName" : "M Sri Ranga Gayathri",
                "StudentLastName" : "",
                "StudentGrade" : "PU-2/12",
                "StudentGender" : "female",
                "Language" : "SANSKRIT"
            }
        ],
        "IsShippingAddressSameAsBillingAddress" : false,
        "StoreCode" : "DKFL",
        "StoreDescription" : "Deeksha DCFL Store is a place where Parents can purchase all the school merchandise in one place at reasonable prices.",
        "StoreBranch" : "",
        "StoreType" : "Online",
        "StoreName" : "Deeksha, Yelahanka, Bengaluru",
        "StoreCustomerId" : ""
    },
    "Products" : [ 
        {
            "ID" : 1,
            "StoreCode" : "DKFL",
            "StoreName" : "Deeksha, Yelahanka, Bengaluru",
            "StoreDescription" : "Deeksha DCFL Store is a place where Parents can purchase all the school merchandise in one place at reasonable prices.",
            "StoreBranch" : "Talaghattapura",
            "AddressLine1" : "31/1, Talaghattapura",
            "AddressLine2" : "Kanakapura Road",
            "Street" : "Vajramuneeswara Temple Road",
            "Landmark" : "",
            "Latitude" : "undefined",
            "Longitude" : "undefined",
            "City" : "Bengaluru",
            "State" : "Karnataka",
            "Country" : "India",
            "Pincode" : "560062",
            "StoreType" : "Online",
            "WarehouseCode" : "",
            "Description" : "",
            "ProductName" : "Boys White & Blue Striped Half Shirt",
            "ProductCode" : "05T9YNCON",
            "ProductType" : "C",
            "Brand" : "SA",
            "VendorCode" : "",
            "SKU" : "DKFLMSHTSAM38",
            "BASESKU" : "DKFL05T9YNCON",
            "CategoryId" : "",
            "CategoryName" : "Uniform/Formal/Shirts/Male",
            "AttributeSet" : "1000000",
            "Gender" : "M",
            "BaseUnitPrice" : 452.38,
            "TaxPercentage" : 5.0,
            "HSNCode" : 6021,
            "BaseUnitOfMeasure" : "",
            "Weight" : 0.0,
            "TaxAmount" : 22.6200008392334,
            "MRP" : 475.0,
            "Weightage" : "",
            "DiscountPrice" : 475.0,
            "TotalOrderQuantity" : 4,
            "TotalProductPrice" : 1900.0,
            "TotalProductDiscountPrice" : 1900.0,
            "MinimumPrice" : 0.0,
            "CurrencyCode" : "INR",
            "MinimumBuyQty" : 1,
            "MaximumBuyQty" : 6,
            "TotalBaseUnitofMeasure" : "",
            "TotalWeight" : "",
            "Variants" : [ 
                {
                    "Name" : "Sizes",
                    "Value" : [ 
                        "38"
                    ],
                    "Code" : [ 
                        "24", 
                        "26", 
                        "28", 
                        "30", 
                        "32", 
                        "34", 
                        "36", 
                        "38", 
                        "40", 
                        "42", 
                        "44", 
                        "46", 
                        "48"
                    ],
                    "UnitofMeasure" : ""
                }, 
                {
                    "Name" : "Colours",
                    "Value" : [ 
                        "WHITE"
                    ],
                    "Code" : [ 
                        "M"
                    ],
                    "UnitofMeasure" : ""
                }, 
                {
                    "Name" : "Grades",
                    "Value" : [ 
                        "PU-1/11"
                    ],
                    "Code" : [ 
                        "U", 
                        "V"
                    ],
                    "UnitofMeasure" : ""
                }
            ]
        }
    ],
    "IsActive" : false,
    "FocusSync" : false
}

Это мой формат mongoDB json. Я объясняю свой код ниже.

func SalesOrderSearch(SalesOrder *models.OrderFilterData) map[string]interface{} {
    logger.Log.Println("OrderRepository SalesOrderSearch Function Begin")
    session, error := driver.Connect()
    db := session.DB(config.Configuration.Database)
    var resp map[string]interface{}
    Status := SalesOrder.Status
    AdmissionID := SalesOrder.AdmissionID
    Grade := SalesOrder.Grade
    ProductName := SalesOrder.ProductName
    Category := SalesOrder.Category
    Branch := SalesOrder.Branch
    Vendor := SalesOrder.Vendor
    fmt.Println(AdmissionID,Grade,ProductName,Branch,Category,Vendor)
    resourceManager := resources.ResourceManager{}
    if error != nil {
        resp := utils.Message(resourceManager.GetProperty(constants.ERROR), resourceManager.GetProperty(constants.DB_SERVER_NOT_REACHABLE_CODE), resourceManager.GetProperty(constants.DB_SERVER_NOT_REACHABLE_DESC))
        return resp
    } else {
        var result []interface{}
        filter := []bson.M{
            bson.M{"$match": bson.M{"OrderStatus": Status, "Customer": bson.M{"$elemMatch":bson.M{"Children":bson.M{"$elemMatch":bson.M{"StudentAdmissionID":AdmissionID}}}},"Products":bson.M{"$elemMatch":bson.M{"ProductName":ProductName,"CategoryName":Category }}}},
            bson.M{ "$skip" : 0 },
            bson.M{ "$limit" : 5 },

        }
        err := db.C(ORDERCOLLECTION).Pipe(filter).All(&result)
        fmt.Println(err);
        if err != nil {
            resp = utils.Message(resourceManager.GetProperty(constants.ERROR), resourceManager.GetProperty(constants.CUSTOMER_SEARCH_NOTFOUND_CODE), resourceManager.GetProperty(constants.CUSTOMER_SEARCH_NOTFOUND_DESC))
        } else {
            resp = utils.Message(resourceManager.GetProperty(constants.SUCCESS), resourceManager.GetProperty(constants.CUSTOMER_SEARCH_FOUND_CODE), resourceManager.GetProperty(constants.CUSTOMER_SEARCH_FOUND_DESC))
            resp["data"] = result
        }
    }
    defer session.Close()
    return resp
}

Здесь мне нужно найти запись в соответствии с заданным условием фильтра, а также это должно быть условие или означает, что если все значение есть, тогда оно будет соответствовать записи как для всего значения или, если есть некоторые значения, он также будет соответствовать записи соответственно. Но в моем случае это вообще не получение записи. Может ли кто-нибудь помочь мне решить эту проблему.

1 Ответ

0 голосов
/ 06 мая 2020

$elemMatch используется при сопоставлении массива, чтобы указать, что несколько критериев должны соответствовать одному и тому же элементу.

Вы используете $elemMatch для поля customer, которое не содержит массива, и поэтому не будет соответствовать оператору $elemMatch.

Если поле, которое вы сопоставляете, не является массивом, или если вы указываете только одно совпадение поля, нет необходимости использовать $elemMatch.

Например:

"Children":bson.M{"$elemMatch":bson.M{"StudentAdmissionID":AdmissionID}

и

"Children.StudentAdminssionId":AdmissionID

должны соответствовать одним и тем же документам.

Ваше совпадение снова: массив Products определяет 2 поля для соответствия, поэтому потребуется $elemMatch

Попробуйте:

bson.M{"$match": bson.M{"OrderStatus": Status, "Customer.Children.StudentAdmissionID":AdmissionID,"Products":bson.M{"$elemMatch":bson.M{"ProductName":ProductName,"CategoryName":Category }}}},
...