How to Get Only One object from array of Objects?

I am having trouble writing query to extract object from an array using SerialNumber

db.query.findOne({orderId:'13052017002593'});

{ 
    "_id" : "36ndPwFKGdcTDRERx", 
    "orderId" : "13052017002593", 
    "items" : [
        {
            "serialNumber" : "XXX", 
            "status" : "COMPLETED", 
            "shippingType" : "MESSENGER", 
            "shippingDate" : ISODate("2017-05-16T10:16:16.941+0000"), 
            "returnDeposit" : true
        },
        {
            "serialNumber" : "YYY", 
            "status" : "COMPLETED", 
            "shippingType" : "MESSENGER", 
            "shippingDate" : ISODate("2017-05-16T10:16:16.941+0000"), 
            "returnDeposit" : true
        }

    ], 

    "createdAt" : ISODate("2017-05-13T10:15:09.904+0000")
}

Suppose if i want to extract object

        {
            "serialNumber" : "XXX", 
            "status" : "COMPLETED", 
            "shippingType" : "MESSENGER", 
            "shippingDate" : ISODate("2017-05-16T10:16:16.941+0000"), 
            "returnDeposit" : true
        },

How Can i extract only this object?

I have database 3.2;

I tried running these queries:

        let params = {
            $and: [{ orderId }, {'items.serialNumber':serialNumber}]
          };

        let ctx = {
            fields:{items:{$elemMatch:serialNumber}}
        }
        let order = Orders.find(params,ctx).fetch()

Which is giving error;

Also i tried:
let order = Orders.find({orderId:orderId},{_id:0,items:{$elemMatch: {serialNumber:serialNumber}}});
returning me all the values in the order object

Any one can help me please. Any suggestion is much appreciated ! Thanks!

Have you looked at this:

In your first example why are you using $and? You only have one item in the $and array.

In your second example, try this:

let order = Orders.find({ _id: 0, orderId:orderId }, {items: { $elemMatch: { serialNumber: serialNumber } } } );
let order = Orders.find({ _id: 0, orderId }, {items: { $elemMatch: { serialNumber } } } ); \\same as before just using ES6 shorthand syntax
1 Like