单个搜索结果在数组中有多个值

Google课程

我有以下模型:

{
    "_id" : ObjectId("5d61aaf8108e185191552bbb"),
    "serials" : [
        "e127av48-0697-4977-b096-5ce79c89a414",
        "d163f80a-55ff-40fe-90b4-331ece5bebd5",
        "4740021f-e9b5-4ca5-bf0e-8554c123bb94",
        "320ffd42-f101-4b1d-8ff4-80bc693a29e6",
        "fef5e68b-aed0-4a96-9488-7941c41d1c1f",
        "2c0752ba-bf7a-4a3b-bd9f-14db4b2f8bae",
        "6c5ff44d-5979-4bff-af12-9e6d282c3789",
        "9c91bf91-72d7-4b71-827b-924947d6e93d",
        "fb34b28e-afb1-4b6a-a3c1-5a1fe44246ee",
        "91ab22ef-702f-4cbd-8919-a67a2b9a684c",
        "ee1a7cb2-e088-47e6-a824-c8697df7d94c",
        "0dc4c687-4db2-481e-a1a6-491320dede11",
        "34612148-3e01-44ee-b262-de2035e63691",
        "5ba85baf-e48a-40af-8578-55ff1a873c76",
        "19fe3672-b6cb-4bb6-8d21-93412b938584",
        "1d0d6f6d-1b49-461b-8661-ecbf43a6595e",
        "d9a5455c-65ee-45e1-ae49-33cc15dec841",
        "4a690a00-a76c-4d3e-aee3-78b2bb731b0c",
        "ae331830-40b4-457c-8cc4-5d548f769c3e",
        "fe3e460b-c89d-4ace-8a36-5ba2b53bf4d0",
        "2cc6a2a0-e029-475f-a7fc-a46a79afb605",
        "a7d07767-eada-4ce3-b083-9b048e9ae9f4"
    ],
    "name" : "ApiCard",
    "producer" : "Farmina",
    "form" : "syrop",
    "__v" : 0
}

我想根据此序列号(“序列”字段)从集合中检索文档(多个)。例如我发现:

[
        "e127av48-0697-4977-b096-5ce79c89a414",
        "d163f80a-55ff-40fe-90b4-331ece5bebd5",
        "4740021f-e9b5-4ca5-bf0e-8554c123bb94",
        "key that doesn't exist",
]

我们必须假设其中一个序列号不存在,因此希望获取有关单个序列预期输出的信息:

[
    {
        "serial":"e127av48-0697-4977-b096-5ce79c89a414",
        "doc":{
            ....whole document where above serial is in array field "serials"
        }
    },
    {
        "serial":"e127av48-0697-4977-b096-5ce79c89a414",
        "doc":{
            ....whole document where above serial is in array field "serials"
        }
    },
    {
        "serial":"e127av48-0697-4977-b096-5ce79c89a414",
        "doc":{
            ....whole document where above serial is in array field "serials"
        }
    },
    {
        "serial":"key that doesn't exist",
        "doc": null
    }
]

我正在尝试最简单的解决方案-通过多个数组项查找mongodb,但不幸的是,它不返回单个序列号的信息。我不确定是否可以准备这种查询。我认为可以执行一些复杂的聚合,但是我什至不知道这种管道。

当然,我可以通过使用多个聚合甚至找到来获得简单的解决方案,但是当应用程序将为每个请求查找10000条记录时,这可能会影响性能。

Himanshu Sharma

以下查询可以解决问题:

db.collection.aggregate([
    {
        $limit:1
    },
    {
        $project:{
            "_id":0,
            "serialsToSearch":[
                    "e127av48-0697-4977-b096-5ce79c89a414",
                    "d163f80a-55ff-40fe-90b4-331ece5bebd5",
                    "4740021f-e9b5-4ca5-bf0e-8554c123bb94",
                    "key that doesn't exist",
            ]
        }
    },
    {
        $unwind:"$serialsToSearch"
    },
    {
        $lookup:{
            "from":"collection",
            "let":{
                "serial":"$serialsToSearch"
            },
            "pipeline":[
                {
                    $match:{
                        $expr:{
                            $in:["$$serial","$serials"]
                        }
                    }
                },
                {
                    $project:{
                        "serials":0
                    }
                }
            ],
            "as":"searialsLookup"
        }
    },
    {
        $unwind:{
            "path":"$searialsLookup",
            "preserveNullAndEmptyArrays":true
        }
    },  
    {
        $project:{
            "serial":"$serialsToSearch",
            "doc":{
                $ifNull:["$searialsLookup",null]
            }
        }
    }
]).pretty()

资料集:

{
    "_id" : ObjectId("5d61aaf8108e185191552bbb"),
    "serials" : [
        "e127av48-0697-4977-b096-5ce79c89a414",
        "d163f80a-55ff-40fe-90b4-331ece5bebd5",
        "4740021f-e9b5-4ca5-bf0e-8554c123bb94",
        "320ffd42-f101-4b1d-8ff4-80bc693a29e6",
        "fef5e68b-aed0-4a96-9488-7941c41d1c1f",
        "2c0752ba-bf7a-4a3b-bd9f-14db4b2f8bae",
        "6c5ff44d-5979-4bff-af12-9e6d282c3789",
        "9c91bf91-72d7-4b71-827b-924947d6e93d",
        "fb34b28e-afb1-4b6a-a3c1-5a1fe44246ee",
        "91ab22ef-702f-4cbd-8919-a67a2b9a684c",
        "ee1a7cb2-e088-47e6-a824-c8697df7d94c",
        "0dc4c687-4db2-481e-a1a6-491320dede11",
        "34612148-3e01-44ee-b262-de2035e63691",
        "5ba85baf-e48a-40af-8578-55ff1a873c76",
        "19fe3672-b6cb-4bb6-8d21-93412b938584",
        "1d0d6f6d-1b49-461b-8661-ecbf43a6595e",
        "d9a5455c-65ee-45e1-ae49-33cc15dec841",
        "4a690a00-a76c-4d3e-aee3-78b2bb731b0c",
        "ae331830-40b4-457c-8cc4-5d548f769c3e",
        "fe3e460b-c89d-4ace-8a36-5ba2b53bf4d0",
        "2cc6a2a0-e029-475f-a7fc-a46a79afb605",
        "a7d07767-eada-4ce3-b083-9b048e9ae9f4"
    ],
    "name" : "ApiCard",
    "producer" : "Farmina",
    "form" : "syrop",
    "__v" : 0
}

输出:

{
    "serial" : "e127av48-0697-4977-b096-5ce79c89a414",
    "doc" : {
        "_id" : ObjectId("5d61aaf8108e185191552bbb"),
        "name" : "ApiCard",
        "producer" : "Farmina",
        "form" : "syrop",
        "__v" : 0
    }
}
{
    "serial" : "d163f80a-55ff-40fe-90b4-331ece5bebd5",
    "doc" : {
        "_id" : ObjectId("5d61aaf8108e185191552bbb"),
        "name" : "ApiCard",
        "producer" : "Farmina",
        "form" : "syrop",
        "__v" : 0
    }
}
{
    "serial" : "4740021f-e9b5-4ca5-bf0e-8554c123bb94",
    "doc" : {
        "_id" : ObjectId("5d61aaf8108e185191552bbb"),
        "name" : "ApiCard",
        "producer" : "Farmina",
        "form" : "syrop",
        "__v" : 0
    }
}
{ "serial" : "key that doesn't exist", "doc" : null }

注意:如果collection将为空,查询将不会提供预期的输出

聚合阶段详细信息:

  • 第一阶段:将记录限制为1,最初,我们的动机是将输入数组聚合。注射将立即完成。
  • 第二阶段:将输入数组投影为serialsToSearch
  • 步骤III:现在我们将输入数组作为字段,可以展开它
  • 阶段IV:在与输入数组的每个字段相同的集合中查找,并检查serials数组中是否存在搜索到的序列
  • 第V阶段:展开查找输出
  • 阶段VI:根据要求的响应投影字段。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章