【问题标题】:How to query single document which contains specific value of some element in array of arrays MongoDB如何查询包含数组MongoDB数组中某些元素的特定值的单个文档
【发布时间】:2016-11-22 00:25:05
【问题描述】:

我有一个包含数组数组的文档,我在 MongoDb 中使用嵌入式文档。假设我有集合名称 Orders 看起来像:-

"_id" : "HjPGrdkffg7dQPtiX",
    "ListOrdersResult" : [
        {
            "Orders" : {
                "Order" : [
                    {
                        "LatestShipDate" : "2016-01-13T18:29:59Z",
                        "OrderType" : "StandardOrder",
                        "PurchaseDate" : "2016-01-11T10:24:49Z",
                        "PaymentExecutionDetail" : {
                            "PaymentExecutionDetailItem" : {
                                "PaymentMethod" : "COD",
                                "Payment" : {
                                    "CurrencyCode" : "INR",
                                    "Amount" : "839.30"
                                }
                            }
                        },
                        "BuyerEmail" : "vccdbptpx2ssd74882@marketplace.amazon.in",
                        "AmazonOrderId" : "402-4031538-7451469",
                        "LastUpdateDate" : "2016-01-14T06:47:17Z",
                        "ShipServiceLevel" : "IN Exp Dom 2",
                        "NumberOfItemsShipped" : "1",
                        "OrderStatus" : "Shipped",
                        "SalesChannel" : "Amazon.in",
                        "ShippedByAmazonTFM" : "false",
                        "LatestDeliveryDate" : "2016-01-19T18:29:59Z",
                        "NumberOfItemsUnshipped" : "0",
                        "BuyerName" : "xyz",
                        "EarliestDeliveryDate" : "2016-01-13T18:30:00Z",
                        "OrderTotal" : {
                            "CurrencyCode" : "INR",
                            "Amount" : "839.30"
                        },
                        "IsPremiumOrder" : "false",
                        "EarliestShipDate" : "2016-01-11T18:30:00Z",
                        "MarketplaceId" : "A21TJRRWUN4KGVC",
                        "FulfillmentChannel" : "MFN",
                        "TFMShipmentStatus" : "Delivered",
                        "PaymentMethod" : "COD",
                        "ShippingAddress" : {
                            "StateOrRegion" : "HARYANA",
                            "City" : "GURGAON",
                            "Phone" : "9999999999",
                            "CountryCode" : "IN",
                            "PostalCode" : "122001",
                            "Name" : "Murthy",
                            "AddressLine1" : "House No. , J Block, Badshahpur"
                        },
                        "IsPrime" : "false",
                        "ShipmentServiceLevelCategory" : "Expedited"
                    },
                    {
                        "LatestShipDate" : "2016-01-13T18:29:59Z",
                        "OrderType" : "StandardOrder",
                        "PurchaseDate" : "2016-01-11T13:16:49Z",
                        "PaymentExecutionDetail" : {
                            "PaymentExecutionDetailItem" : {
                                "PaymentMethod" : "COD",
                                "Payment" : {
                                    "CurrencyCode" : "INR",
                                    "Amount" : "899.40"
                                }
                            }
                        },
                        "BuyerEmail" : "xyz@marketplace.amazon.in",
                        "AmazonOrderId" : "402-2142159-5087541",
                        "LastUpdateDate" : "2016-01-14T06:47:15Z",
                        "ShipServiceLevel" : "IN Exp Dom 2",
                        "NumberOfItemsShipped" : "1",
                        "OrderStatus" : "Cancel",
                        "SalesChannel" : "Amazon.in",
                        "ShippedByAmazonTFM" : "false",
                        "LatestDeliveryDate" : "2016-01-19T18:29:59Z",
                        "NumberOfItemsUnshipped" : "0",
                        "BuyerName" : "demo prakash",
                        "EarliestDeliveryDate" : "2016-01-13T18:30:00Z",
                        "OrderTotal" : {
                            "CurrencyCode" : "INR",
                            "Amount" : "899.40"
                        },
                        "IsPremiumOrder" : "false",
                        "EarliestShipDate" : "2016-01-11T18:30:00Z",
                        "MarketplaceId" : "A21TJEUUN4WGV",
                        "FulfillmentChannel" : "MFN",
                        "TFMShipmentStatus" : "Delivered",
                        "PaymentMethod" : "COD",
                        "ShippingAddress" : {
                            "StateOrRegion" : "DELHI",
                            "City" : "DELHI",
                            "Phone" : "99999999",
                            "CountryCode" : "IN",
                            "PostalCode" : "110038",
                            "Name" : "Demo prakash",
                            "AddressLine1" : "Hn 638 gali n 04 Wazirabad new delhi"
                        },
                        "IsPrime" : "false",
                        "ShipmentServiceLevelCategory" : "Expedited"
                    },
                    }
                ]
            },
            "CreatedBefore" : "2015-03-19T06:17:59Z"
        }
    ],
    "ResponseMetadata" : {
        "RequestId" : "cf94645e-ada7-4ec6-b161-a97d07a77817"
    },
    "seller_user_id" : "yg4e34ccodzf3GPR2",
}

如您所见,这是包含数组的全部数据的单个文档,我想从该订单数组中获取状态为取消的订单。

所以我已经使用了:-

var orderDetails = orders.find({"ListOrdersResult.Orders.Order":{$elemMatch: { OrderStatus:"Canceled"}}}).fetch();

我也试过:-

orders.find({"ListOrdersResult.Orders.Order.OrderStatus":'Canceled'}).fetch();

因此,这将返回包含已取消状态和其他状态的整个文档,但我只想从包含状态为待处理的文档中选择结果。

那么在 mongoDb 中是否有任何方法可以从包含嵌套数组数组作为对象的单个文档中查询选定的值。

或者我需要将值存储到 diff diff 文档中,这只是解决方案。

如有任何帮助,请提供帮助

谢谢!

【问题讨论】:

  • 尝试使用 mongodb 的聚合。

标签: javascript arrays node.js mongodb meteor


【解决方案1】:

您可以使用任何流星聚合包。您可以使用 match 然后对数据进行分组,然后将其发送到客户端。Like :

var ordersLines = orders.aggregate([
                      {$unwind : "$ListOrdersResult.Orders.Order"},
                      {$match : { OrderStatus:"Canceled"} },
                      {$project : {
                      OrderType : '$ListOrdersResult.Orders.Order.OrderType'
                      ....  
                           }
                      }
                  ]);
return ordersLines;

但我建议您使用不同的文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2020-04-19
    相关资源
    最近更新 更多