Как найти документ на основе значения во вложенном массиве с целочисленными ключами? - PullRequest
0 голосов
/ 09 апреля 2019

Мой запрос поиска выглядит следующим образом:

bson.M{"_id": oId, "items": bson.M{"$elemMatch": bson.M{"id": theId, "active": true}}} (где theId - идентификатор объекта из метода)

Я пытаюсь выбрать документ с совпадающим id, где active имеет значение true

{ 
    "_id" : ObjectId("5ca0e44acb216df65405dc5f"), 
    "items" : {
        "0" : {
            "id" : ObjectId("5c9fbb25e86deef65491c321"), 
            "active" : true
        }, 
        "1" : {
            "id" : ObjectId("5c9fbb57cb216df65405dc5c"), 
            "active" : false
        }, 
        "2" : {
            "id" : ObjectId("5c9fbb65cb216df65405dc5d"), 
            "active" : false
        }
    }, 
}

Но как бы я это ни делал, он никогда не находит никаких документов. Как это можно сделать?

Редактировать: Добавлен мой код Go.

func CountRows(find interface{}) int {
    session := database.GetMongoSession()
    defer session.Close()

    c := session.DB(config.Settings.Database.Name).C("list")

    count, err := c.Find(find).Count()
    if err != nil {
        log.Fatal(err)
    }

    return count
}

func IsActive(oId bson.ObjectId, theId bson.ObjectId) bool {
    if CountRows(bson.M{"_id": oId, "items": bson.M{"$elemMatch": bson.M{"id": theId , "active": true}}}) > 0 {
        return true
    }

    return false
}

Он всегда возвращает false, потому что не может найти никаких документов.

1 Ответ

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

Если у вас есть база данных, я бы предложил реструктурировать ваши данные так:

{ 
    "_id" : ObjectId("5ca0e44acb216df65405dc5f"), 
    "items" : [
        {
            "id" : ObjectId("5c9fbb25e86deef65491c321"), 
            "active" : true
        }, 
        {
            "id" : ObjectId("5c9fbb57cb216df65405dc5c"), 
            "active" : false
        }, 
        {
            "id" : ObjectId("5c9fbb65cb216df65405dc5d"), 
            "active" : false
        }
    ]
}

Затем вы можете использовать собственную документацию MongoDB: Запросить массив методов Embedded Documents .

...