Daniela Morais
Daniela Morais

Reputation: 2237

How do I get a specific element of the array in mongoDB?

I want to get a specific element of the array and through the responsaveis.$ ([email protected]) but there is no result, there is problem in my syntax?

{
    "_id" : ObjectId("54fa059ce4b01b3e086c83e9"),
    "agencia" : "Abc",
    "instancia" : "dentsuaegis",
    "cliente" : "Samsung",
    "nomeCampanha" : "Serie A",
    "ativa" : true,
    "responsaveis" : [ 
        "[email protected]", 
        "[email protected]"
    ],
    "email" : "[email protected]"
    }

Syntax 1

mongoCollection.findAndModify("{'responsaveis.$' : #}", oldUser.get("email"))
                .with("{$set : {'responsaveis.$' : # }}", newUser.get("email"))
                .returnNew().as(BasicDBObject.class);

Syntax 2

db.getCollection('validatag_campanhas').find({"responsaveis.$" : "[email protected]"})

Result

Fetched 0 record(s) in 1ms

Upvotes: 0

Views: 88

Answers (2)

thegreenogre
thegreenogre

Reputation: 1579

The $ positional operator is only used in update(...) or project calls, you can't use it to return the position within an array.

The correct syntax would be :-

Syntax 1

mongoCollection.findAndModify("{'responsaveis' : #}", oldUser.get("email"))
                .with("{$set : {'responsaveis.$' : # }}", newUser.get("email"))
                .returnNew().as(BasicDBObject.class);

Syntax 2

db.getCollection('validatag_campanhas').find({"responsaveis" : "[email protected]"})

If you just want to project the specific element, you can use the positional operator $ in projection as

{"responsaveis.$":1}

db.getCollection('validatag_campanhas').find({"responsaveis" : "[email protected]"},{"responsaveis.$":1})

Upvotes: 1

Try with this

db.validatag_campanhas.aggregate(
  { $unwind : "$responsaveis" },
      { 
        $match  : {
         "responsaveis": "[email protected]"
      }
  },
  { $project : { responsaveis: 1, _id:0 }}
);

That would give you all documents which meets that conditions

{
    "result" : [
        {
            "responsaveis" : "[email protected]"
        }
    ],
    "ok" : 1
}

If you want one document that has in its responsaveis array the element "[email protected]" you can eliminate the project operator like

db.validatag_campanhas.aggregate(
  { $unwind : "$responsaveis" },
      { 
        $match  : {
         "responsaveis": "[email protected]"
      }
  }
);

And that will give you

{
    "result" : [
        {
            "_id" : ObjectId("54fa059ce4b01b3e086c83e9"),
            "agencia" : "Abc",
            "instancia" : "dentsuaegis",
            "cliente" : "Samsung",
            "nomeCampanha" : "Serie A",
            "ativa" : true,
            "responsaveis" : "[email protected]",
            "email" : "[email protected]"
        }
    ],
    "ok" : 1
}

Hope it helps

Upvotes: 0

Related Questions