Почему мой запрос mongodb возвращает 0 результатов? - PullRequest
0 голосов
/ 15 апреля 2019

Это моя база данных: Documents
С помощью этого го кода я пытаюсь найти всех пользователей, которые либо вовлечены в историю, либо создали историю с заданным идентификатором.

func main() {
    for stf.DB == nil {
    }

    collection := stf.DB.Collection("user")
    ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
    defer cancel()

    id, _ := primitive.ObjectIDFromHex("5cb4dd7e29d3dca573a73d4c")
    fter := bson.M{"_id": id}

    involvedFilter := bson.M{"stories_involved": fter}
    createdFilter := bson.M{"stories_created": fter}

    filter := bson.M{"$or": []bson.M{involvedFilter, createdFilter}}

    cur, err := collection.Find(ctx, filter)
    if err != nil {
        log.Fatal(err.Error())
    }

    defer cur.Close(ctx)

    for cur.Next(ctx) {
        var result bson.M
        err := cur.Decode(&result)

        if err != nil {
            log.Fatal(err.Error())
        }
        fmt.Println(result)
    }
    if err := cur.Err(); err != nil {
        log.Fatal(err.Error())
    }
}


Код не выводит никаких ошибок, но также не выводит никаких объектов ...
Заранее спасибо за помощь!

1 Ответ

1 голос
/ 16 апреля 2019

Ваш запрос переводится на:

{"$or":[
   {"stories_involved":{
           "_id": ObjectId("5cb4dd7e29d3dca573a73d4c")}}, 
   {"stories_created":{
           "_id":ObjectId("5cb4dd7e29d3dca573a73d4c")}}
]}

Это означает, что он ищет любой документ с вложенным документом то есть:

{stories_involved: {_id: <value>}} ИЛИ {stories_created: {_id: <value>}}.

Однако документы в коллекции содержат вложенный массив документов т.е.:

{stories_involved: [{_id:<value>}]} ИЛИ {stories_created: [{_id:<value>}]}

По этой причине ваш запрос не возвращает никакого значения (и не содержит ошибок, поскольку синтаксис запроса правильный).

Существует два способа Запрос документа, вложенного в массив с использованием точечной нотации . Если вам известен индекс массива для документа, вы можете просто указать позицию:

id, _ := primitive.ObjectIDFromHex("5cb4dd7e29d3dca573a73d4c")
involvedFilter := bson.M{"stories_involved.0._id": id}
createdFilter := bson.M{"stories_created.0._id": id}
filter := bson.M{"$or": []bson.M{involvedFilter, createdFilter}}
cur, err := collection.Find(ctx, filter)

Если вам неизвестна позиция индекса документа, вложенного в массив, объедините имя поля массива с точкой (.) И именем поля во вложенном документе:

id, _ := primitive.ObjectIDFromHex("5cb4dd7e29d3dca573a73d4c")
involvedFilter := bson.M{"stories_involved._id": id}
createdFilter := bson.M{"stories_created._id": id}
filter := bson.M{"$or": []bson.M{involvedFilter, createdFilter}}
cur, err := collection.Find(ctx, filter)

См. Также MongoDB: документы запроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...