skip to Main Content

I am trying to fetch the details from the MongoDB where value of a particular attribute is either a or b.
For example,
In my collection Test(Attr_A, Attr_B, Attr_C) get the record where value of Attr_C is either "x" or "y".

Filter Query:

filter := bson.M{"Attr_A": "123", "Attr_B": "456",
        "$in": bson.A{bson.D{{"Attr_C", "x"}},
            bson.D{{"Attr_C", "y"}}}}
result := repo.DBPlug.Get("Test", filter)

Error I am getting is,

(BadValue) unknown top level operator: $in. If you have a field name that starts with a ‘$’ symbol, consider using $getField or $setField.

2

Answers


  1. You should specify the field name for the $in operation.
    Since the JSON filter query should look like:

    find({"Attr_A": "123", "Attr_B": "456", "Attr_C": {$in: ["x","y"]}})
    

    I guess in BSON it should be something like:

    filter := bson.M{"Attr_A": "123", "Attr_B": "456",
            "Attr_C": bson.M{"$in": bson.A{"x","y"}}}
    

    or something like:

    filter := bson.M{"Attr_A": "123", "Attr_B": "456",
              bson.D{{"Attr_C", bson.D{{"$in", bson.A{"x","y"}}}}}
              }
    

    or:

    filter := bson.D{{"Attr_A": "123"}, {"Attr_B": "456"},
                {bson.D{{"Attr_C", bson.D{{"$in", bson.A{"x","y"}}}
                }}
              }}
    

    Since this is a filter, the use of bson.M or bson.D is according to your choice – there is no difference in this case. See elaboration

    Login or Signup to reply.
  2. In pure JSON format your filter query would be:

    {
        "Attr_A": "123", 
        "Attr_B": "456",
        "Attr_C": {
            "$in": ["x", "y", "z"],
        },
    }
    

    Simply translating this to bson, you get

    filter := bson.M{
        "Attr_A": "123", 
        "Attr_B": "456",
        "Attr_C": bson.M{
            "$in": bson.A{"x", "y", "z"},
        },
    }
    result := repo.DBPlug.Get("Test", filter)
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search