Как найти конкретные элементы массива в документе mongoDb с запросом и фильтром по диапазону? - PullRequest
2 голосов
/ 26 апреля 2019

У меня есть коллекция, в которой хранится документ в следующем формате:

/* 1 */
{
    "_id" : ObjectId("5cc1a108c5475b9e91bb7830"),
    "item" : "journal",
    "instock" : [ 
        {
            "warehouse" : "A",
            "qty" : 5.0
        }, 
        {
            "warehouse" : "C",
            "qty" : 15.0
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5cc1a108c5475b9e91bb7831"),
    "item" : "notebook",
    "instock" : [ 
        {
            "warehouse" : "C",
            "qty" : 5.0
        }
    ]
}

/* 3 */
{
    "_id" : ObjectId("5cc1a108c5475b9e91bb7832"),
    "item" : "paper",
    "instock" : [ 
        {
            "warehouse" : "A",
            "qty" : 60.0
        }, 
        {
            "warehouse" : "B",
            "qty" : 15.0
        }
    ]
}

/* 4 */
{
    "_id" : ObjectId("5cc1a108c5475b9e91bb7833"),
    "item" : "planner",
    "instock" : [ 
        {
            "warehouse" : "A",
            "qty" : 40.0
        }, 
        {
            "warehouse" : "B",
            "qty" : 5.0
        }
    ]
}

/* 5 */
{
    "_id" : ObjectId("5cc1a108c5475b9e91bb7834"),
    "item" : "postcard",
    "instock" : [ 
        {
            "warehouse" : "B",
            "qty" : 15.0
        }, 
        {
            "warehouse" : "C",
            "qty" : 35.0
        },
        {
            "warehouse" : "M",
            "qty" : 50.0
        }
    ]
}

/* 6 */
{
    "_id" : ObjectId("5cc1a16ea794ebd5fc278172"),
    "item" : "dig",
    "instock" : [ 
        {
            "warehouse" : "A",
            "qty" : 5.0
        }
    ]
}

Я хочу найти конкретный массив документов, у которого qty больше указанного значения и меньше другого указанного значения.

Например, Я хочу, чтобы элемент "открытка" и стоимость товара в запасе были больше 10 и меньше 40, поэтому он возвращает мне документ открытки с массивом instock, содержащий только один элемент, который соответствует выводу:

/* 1 */
    {
        "_id" : ObjectId("5cc1a108c5475b9e91bb7834"),
        "item" : "postcard",
        "instock" : [ 
            {
                "warehouse" : "B",
                "qty" : 15.0
            }, 
            {
                "warehouse" : "C",
                "qty" : 35.0
            }
        ]
    }

1 Ответ

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

Вы можете использовать $ match для фильтрации на уровне документа и $ filter , чтобы применить ваше условие к массиву:

db.collection.aggregate([
    {
        $match: { item: "postcard" }
    },
    {
        $addFields: {
            instock: {
                $filter: {
                    input: "$instock",
                    cond: {
                        $and: [
                            { $gt: [ "$$this.qty", 10 ] },
                            { $lt: [ "$$this.qty", 30 ] }
                        ]
                    }
                }
            }
        }
    }
])

Mongo Playground

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