Не удается найти документы с использованием mgo golang с частичными атрибутами

Я пытаюсь удалить кучу документов, которые имеют общий атрибут. Вот как выглядит документ:

{
    _id : {
        attr1 : 'foo',
        attr2 : 'bar'
    },
    attr3 : 'baz',
}

Несколько документов будут иметь одинаковое значение 'foo' в записи attr1. Я пытаюсь удалить все это. Для этого у меня есть что-то похожее на это:

type DocId struct {
    Attr1 string `bson:"attr1,omitempty"`
    Attr2 string `bson:"attr2,omitempty"`
}

type Doc struct {
    Id DocId `bson:"_id,omitempty"`
    Attr3 string `bson:"attr3,omitempty"`
}


doc := Doc{
    Id : DocId{ Attr1 : 'foo' },
}

collection := session.DB("db").C("collection")
collection.Remove(doc)

Проблема здесь в том, что я получаю ошибку Not found при вызове удаления. Вы видите что-то странное в коде?

Большое спасибо!


person ThisIsErico    schedule 23.04.2015    source источник
comment
Ну, одна странная вещь, которую я вижу в коде, это то, что он не компилируется, так как 'foo' приводит к синтаксической ошибке.   -  person rightfold    schedule 23.04.2015
comment
Not found может быть результатом неправильного написания имени коллекции или отсутствия документов, соответствующих критериям (например, вы неправильно написали значение атрибута или уже удалили все, что ему соответствует). Вы можете подтвердить, что это не так?   -  person icza    schedule 23.04.2015
comment
@rightfold, как вы можете догадаться, это всего лишь пример, который вам не нужно выполнять;)   -  person ThisIsErico    schedule 23.04.2015
comment
@icza, я уже проверил это. Я запрашиваю правильную коллекцию, у которой есть соответствующие критерии :)   -  person ThisIsErico    schedule 23.04.2015


Ответы (1)


Это просто следствие того, как MongoDB обрабатывает точное и частичное совпадения. Это можно быстро продемонстрировать с помощью оболочки mongo:

# Here are my documents
> db.docs.find()
{ "_id" : { "attr1" : "one", "attr2" : "two" }, "attr3" : "three" }
{ "_id" : { "attr1" : "four", "attr2" : "five" }, "attr3" : "six" }
{ "_id" : { "attr1" : "seven", "attr2" : "eight" }, "attr3" : "nine" }

# Test an exact match: it works fine
> db.docs.find({_id:{attr1:"one",attr2:"two"}})
{ "_id" : { "attr1" : "one", "attr2" : "two" }, "attr3" : "three" }

# Now let's remove attr2 from the query: nothing matches anymore,
# because MongoDB still thinks the query requires an exact match
> db.docs.find({_id:{attr1:"one"}})
... nothing returns ...

# And this is the proper way to query with a partial match: it now works fine.
> db.docs.find({"_id.attr1":"one"})
{ "_id" : { "attr1" : "one", "attr2" : "two" }, "attr3" : "three" }

Дополнительную информацию по этой теме можно найти в документации.

В вашей программе Go я бы предложил использовать следующую строку:

err = collection.Remove(bson.M{"_id.attr1": "foo"})

Не забывайте тестировать ошибки после каждого обращения к MongoDB.

person Didier Spezia    schedule 23.04.2015
comment
Большое спасибо, Дидье. Я знаю о сопоставлении в монго, вот как я запрашивал свои документы на консоли. Сомнение было, когда мне нужно было написать это поведение, используя mgo. После того, что вы говорите, я лучше начну использовать нотацию bson.M. Еще раз большое спасибо! - person ThisIsErico; 23.04.2015