Pomor
Pomor

Reputation: 11

Mongodb find wrong document

You can see my document as bellow. How can I write a find for my uniq fields?

I need search a document where KEYMAP is (SNUM="3151" and "SKEY"="THR" and "SID"="ID_HUT")

 {     
    "CID":"2",
     "DESCRIPTION":"test",
     "SECKEY":"test",
     "API":{
          "SMS":"http://api.php",
          "DR":"http://api2.php"
        },
        "LOGS":{
             "IN":"log_cid_in_1",
             "OUT": "log_cid_out_1"
        },
        "KEYMAP":[              
            {"SNUM":"3151","SKEY":"THR", "SID":"ID_HUT"},
            {"SNUM":"3152","SKEY":"ONE", "SID":"ID_XL"},
            {"SNUM":"3153","SKEY":"TWO", "SID":"ID_INDO"}

        ]

    }    

    db.content_provider_map.ensureIndex({"KEYMAP.SNUM":1,"KEYMAP.SKEY":1,"KEYMAP.SID":1},{unique:true});
        db.mycollection.find({"KEYMAP.SNUM":"3151","KEYMAP.SKEY":"TWO","KEYMAP.SID":"ID_XL"});# not work. it find the document

Upvotes: 1

Views: 109

Answers (1)

Sammaye
Sammaye

Reputation: 43884

I believe you want to use $elemMatch ( http://docs.mongodb.org/manual/reference/operators/#_S_elemMatch ) here like:

find({KEYMAP: {$elemMatch: {SNUM: "3151", SKEY: "TWO", SID: "ID_XL"}}})

Also unique indexes on subdocuments do not work the way you probably think they do. They create uniqueness across all documents not just that one document. If you want a unique index on that one document then you will need to use something like $addToSet or an upsert function on the subdocument.

Upvotes: 1

Related Questions