mongodb如何仅选择所有阵列';s值与数据一致

mongodb如何仅选择所有阵列';s值与数据一致,mongodb,mongodb-query,Mongodb,Mongodb Query,我有两个数据 {"_id" : ObjectId("5e2564e7fc4adf6813df71fa"), "product_nums" : [ { "product_number" : "123123qwedf2", "product_status" : "F" } ]} {"_id" : ObjectId("5e2570d20b83102cad7adf04"), "product_nums" : [ { "produ

我有两个数据

{"_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"
    }
]}
我只想得到第一个数据。按筛选产品搜索时\u status=“F”

这是我的疑问:

db.getCollection('product_number').find({"product_nums" : {"$elemMatch" : {"product_status": "F"}}})
但该查询也会返回第二个数据

我怎样才能得到这个呢

{
"_id" : ObjectId("5e2564e7fc4adf6813df71fa"),
"product_nums" : [ 
    {
        "product_number" : "123123qwedf2",
        "product_status" : "F"
    }
]}
您可以尝试以下方法:

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"
        }
    ]
}
结果:

/* 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"
        }
    ]
}

下面是一个关于如何查询特定数组元素的示例:。嘿@srinivasy,我想知道,是否可以根据产品状态使用投影来限制_id和产品_nums值。虽然您的解决方案围绕答案展开,但如果存在多个键值对,并且只有他需要这2个元素,该怎么办。如果您希望对此查询进行投影。这很有意义。@Balaji.J.B:即使文档有更多字段,这个查询也只会返回
\u id
&
product\u nums
,以防他需要剩余字段,他需要在投影中指定所有需要的字段!!感谢您的详细解释和样品。我试过了。但我得到了我想要的不同结果。我的意思是,我只想在您的收集数据中获取Objectid(5e2564e7fc4adf6813df71fa)。因为ObjectId(“5e2570d20b83102cad7adf04”)具有“S”产品_状态。对不起,我的英语解释不好。修复前的答案也很有帮助!!它解决了我的另一个问题。非常感谢。