Как mongodb выбирает только данные, значения всех массивов которых совпадают с данными - PullRequest
1 голос
/ 23 января 2020

У меня есть эти две данные.

{"_id" : ObjectId("5e2564e7fc4adf6813df71fa"),
"product_nums" : [ 
    {
        "product_number" : "123123qwedf2",
        "product_status" : "F"
    }
]}
{"_id" : ObjectId("5e2570d20b83102cad7adf04"),
"product_nums" : [ 
    {
        "product_number" : "123123qwedf",
        "product_status" : "S"
    }, 
    {
        "product_number" : "123123qwedf2",
        "product_status" : "F"
    }
]}

Я хочу получить только первые данные. когда я ищу по фильтру product_status = "F"

Это мой запрос:

db.getCollection('product_number').find({"product_nums" : {"$elemMatch" : {"product_status": "F"}}})

Но этот запрос также возвращает вторые данные.

Как я могу получить это только :

{
"_id" : ObjectId("5e2564e7fc4adf6813df71fa"),
"product_nums" : [ 
    {
        "product_number" : "123123qwedf2",
        "product_status" : "F"
    }
]}

1 Ответ

1 голос
/ 23 января 2020

Вы можете попробовать это:

db.getCollection('product_number').aggregate([{
    $addFields: {
        data: { /** filter returns [] if input array has only F's */
            $filter:
            {
                input: '$product_nums.product_status', /** $product_nums.product_status = ['F'], ['S','F'] */
                as: "each",
                cond: { $ne: ['$$each', 'F'] }
            }
        }
    }
}, { $match: { data: [] } }, { $project: { data: 0 } }])

Сбор данных:

/* 1 */
{
    "_id" : ObjectId("5e2564e7fc4adf6813df71fa"),
    "product_nums" : [ 
        {
            "product_number" : "123123qwedf2",
            "product_status" : "F"
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5e2570d20b83102cad7adf04"),
    "product_nums" : [ 
        {
            "product_number" : "123123qwedf",
            "product_status" : "S"
        }, 
        {
            "product_number" : "123123qwedf2",
            "product_status" : "F"
        }
    ]
}

/* 3 */
{
    "_id" : ObjectId("5e291efcd02e05b694d18244"),
    "product_nums" : [ 
        {
            "product_number" : "123123qwedf2",
            "product_status" : "C"
        }
    ]
}

/* 4 */
{
    "_id" : ObjectId("5e2f93bad02e05b694989468"),
    "product_nums" : [ 
        {
            "product_number" : "123123qwedf",
            "product_status" : "F"
        }, 
        {
            "product_number" : "123123qwedf2",
            "product_status" : "F"
        }
    ]
}

Результат:

/* 1 */
{
    "_id" : ObjectId("5e2564e7fc4adf6813df71fa"),
    "product_nums" : [ 
        {
            "product_number" : "123123qwedf2",
            "product_status" : "F"
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5e2f93bad02e05b694989468"),
    "product_nums" : [ 
        {
            "product_number" : "123123qwedf",
            "product_status" : "F"
        }, 
        {
            "product_number" : "123123qwedf2",
            "product_status" : "F"
        }
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...