这是我一直用于获取一些随机uniqueXperiences的查询,因为我已经查找了xpert,并且想要投影其_id和名称。

db.getCollection('uniquexperiences').aggregate([{
        '$sample': {
          'size': 2
        }
      }, {
        '$lookup': {
          'from': 'users',
          'as': 'Xpert',
          'pipeline':[{
                '$project': {
                   'name': 1
                 }
           }]
        }
      }]);


我得到的输出是这样的:

/* 1 */
{
    "_id" : ObjectId("5b558b5997199d3ec4953e6b"),
    "updatedBy" : ObjectId("5b433dbf6a93e56a21f610eb"),
    "updatedAt" : ISODate("2018-10-10T10:56:36.952Z"),
    "createdBy" : ObjectId("5b433dbf6a93e56a21f610eb"),
    "createdAt" : ISODate("2018-07-23T08:01:29.125Z"),
    "title" : "Horse riding at EIRS",
    "organisationFlag" : false,
    "xperienceSubCategory" : [
        ObjectId("5b4de8199f07bf0b303b8c5f")
    ],
    "xpert" : [
        ObjectId("5b51b054054a962cc6f914db")
    ],
    "description" : "Beautiful rugged landscape makes Ladakh stand apart in the country. There is indeed so much that needs to be explored here and little did we know that amongst the best ways to explore this place is riding a horse. In the remote places like Zanskar Valley, where paved roads are rare and motor biking is not every ones cup of tea, horses make an incredible means of travel. One can access to Zangla, Penzela Pass, Panikhar Fort and Zongkhul, Stongdey and Gelugpa monasteries on a horseback.",
    "__v" : 4,
    "images" : [
        {
            "public_id" : "dotttg3xm0vvqygr4n1w",
            "version" : 1537776979,
            "signature" : "4fb562aa4115941e78f773dd11ed6be37a337acd",
            "width" : 1280,
            "height" : 640,
            "format" : "jpg",
            "resource_type" : "image",
            "url" : "http://res.cloudinary.com/xplr-qa/image/upload/v1537776979/dotttg3xm0vvqygr4n1w.jpg",
            "secure_url" : "https://res.cloudinary.com/xplr-qa/image/upload/v1537776979/dotttg3xm0vvqygr4n1w.jpg",
            "_id" : ObjectId("5ba89d55ac69b4784a4f3a1f")
        },
        {
            "public_id" : "cfdepst0r2wz39rowvzd",
            "version" : 1537776980,
            "signature" : "e770b7354c01ffce61c2e3cb83c79456dacc5438",
            "width" : 2100,
            "height" : 1526,
            "format" : "jpg",
            "resource_type" : "image",
            "url" : "http://res.cloudinary.com/xplr-qa/image/upload/v1537776980/cfdepst0r2wz39rowvzd.jpg",
            "secure_url" : "https://res.cloudinary.com/xplr-qa/image/upload/v1537776980/cfdepst0r2wz39rowvzd.jpg",
            "_id" : ObjectId("5ba89d55ac69b4784a4f3a1e")
        },
        {
            "public_id" : "lqfk6twitfefrjq1h2jq",
            "version" : 1537776979,
            "signature" : "ad1e0079a9419bde0047228446be17218117cf2e",
            "width" : 2500,
            "height" : 1666,
            "format" : "jpg",
            "resource_type" : "image",
            "url" : "http://res.cloudinary.com/xplr-qa/image/upload/v1537776979/lqfk6twitfefrjq1h2jq.jpg",
            "secure_url" : "https://res.cloudinary.com/xplr-qa/image/upload/v1537776979/lqfk6twitfefrjq1h2jq.jpg",
            "_id" : ObjectId("5ba89d55ac69b4784a4f3a1d")
        }
    ],
    "source" : "",
    "price" : 400,
    "meetingLocation" : [],
    "coordinates" : [
        72.955162,
        19.172098
    ],
    "purchaseCount" : 10,
    "Xpert" : [
        {
            "_id" : ObjectId("5b518101752982066a0dcc08"),
            "name" : {
                "last" : "Bourdain",
                "first" : "Anthony"
            }
        },
        {
            "_id" : ObjectId("5b51b054054a962cc6f914db"),
            "name" : {
                "last" : "Yane",
                "first" : "Sid"
            }
        },
        {
            "_id" : ObjectId("5b51c00597199d3ec4953e68"),
            "name" : {
                "last" : "ipsum",
                "first" : "Lorem"
            }
        },
        {
            "_id" : ObjectId("5b59a8cdca722c3177cf3e63"),
            "name" : {
                "last" : "Lorem",
                "first" : "Test"
            }
        },
        {
            "_id" : ObjectId("5b5eea6e2d4b6a04b2d9d599")
        },
        {
            "_id" : ObjectId("5b5f02e22d4b6a04b2d9d5f1")
        },
        {
            "_id" : ObjectId("5b60364f9e866d6453fef3ea"),
            "name" : {
                "last" : "Lorem",
                "first" : "ipsum"
            }
        },
        {
            "_id" : ObjectId("5b6d70f96aaf19087ac6d9e9"),
            "name" : {
                "first" : "Indrajit",
                "last" : "Jadhav"
            }
        },
        {
            "_id" : ObjectId("5b6d81953da5c50974642974"),
            "name" : {
                "last" : "Lorem",
                "first" : "shin"
            }
        },
        {
            "_id" : ObjectId("5b6d831f3da5c50974642975"),
            "name" : {
                "last" : "Lorem",
                "first" : "Shin "
            }
        },
        {
            "_id" : ObjectId("5b6d83b83da5c50974642976"),
            "name" : {
                "last" : "wert",
                "first" : "fadsg"
            }
        },
        {
            "_id" : ObjectId("5b6d83ee3da5c50974642977"),
            "name" : {
                "last" : "asdfsaf",
                "first" : "sadf"
            }
        },
        {
            "_id" : ObjectId("5b7ba46cd0e5fa137805552b"),
            "name" : {
                "first" : "Vivek",
                "last" : "Pandey"
            }
        },
        {
            "_id" : ObjectId("5b7bb359d0e5fa13780555a9"),
            "name" : {
                "first" : "theamalageeks",
                "last" : "null"
            }
        },
        {
            "_id" : ObjectId("5b7bd19ed0e5fa137805565d"),
            "name" : {
                "first" : "Anikesh",
                "last" : "Baburanjan"
            }
        },
        {
            "_id" : ObjectId("5b7fa359211f5649518ae311"),
            "name" : {
                "first" : "Akhsay",
                "last" : "Gaikwad"
            }
        },
        {
            "_id" : ObjectId("5b80181fab8747537011be5c"),
            "name" : {
                "first" : "Sagar",
                "last" : "Bisen"
            }
        },
        {
            "_id" : ObjectId("5b83f1c5de663c0dcccfb483"),
            "name" : {
                "first" : "INDRAJIT",
                "last" : "JADHAV"
            }
        },
        {
            "_id" : ObjectId("5b92154efc790f18121f9e02"),
            "name" : {
                "first" : "sagar",
                "last" : "bisen"
            }
        },
        {
            "_id" : ObjectId("5ba39c509350135c9951ecb6"),
            "name" : {
                "first" : "Anikesh",
                "last" : "Baburajan"
            }
        },
        {
            "_id" : ObjectId("5ba3b8e79350135c9951ecb7"),
            "name" : {
                "first" : "Anurag",
                "last" : "Banerjee"
            }
        },
        {
            "_id" : ObjectId("5ba3c14e9350135c9951ecb8"),
            "name" : {
                "first" : "Dave",
                "last" : "Jhala"
            }
        },
        {
            "_id" : ObjectId("5ba4dfcf6bb5277e1d7db2af"),
            "name" : {
                "first" : "Mark",
                "last" : "Henry"
            }
        },
        {
            "_id" : ObjectId("5ba4e1c0452d7e01ce3dd34e"),
            "name" : {
                "first" : "Ankita",
                "last" : "Mestry"
            }
        },
        {
            "_id" : ObjectId("5ba7795b452d7e01ce3dd34f"),
            "name" : {
                "first" : "Abhishek",
                "last" : "Gupta"
            }
        },
        {
            "_id" : ObjectId("5ba9ec5844996a4be81a0c12"),
            "name" : {
                "first" : "Neeti",
                "last" : "Patil"
            }
        },
        {
            "_id" : ObjectId("5baa1abf44996a4be81a0c13"),
            "name" : {
                "first" : "Krishna",
                "last" : "S"
            }
        },
        {
            "_id" : ObjectId("5bb481d4c77dd914de2cb2f7"),
            "name" : {
                "first" : "krishna",
                "last" : "shetty"
            }
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5bab23c897f85d07b9235a19"),
    "updatedBy" : ObjectId("5b433dbf6a93e56a21f610eb"),
    "updatedAt" : ISODate("2018-10-10T10:57:01.790Z"),
    "createdBy" : ObjectId("5b433dbf6a93e56a21f610eb"),
    "createdAt" : ISODate("2018-09-26T06:14:32.637Z"),
    "xpert" : ObjectId("5ba4dfcf6bb5277e1d7db2af"),
    "title" : "Mumbai Temples Tour",
    "images" : [
        {
            "public_id" : "uvmemwfwmjfl7pmv4upk",
            "version" : 1537943055,
            "signature" : "5358320e4f396a2ee980e767a16d4a92228c95d6",
            "width" : 1440,
            "height" : 900,
            "format" : "jpg",
            "resource_type" : "image",
            "url" : "http://res.cloudinary.com/xplr-qa/image/upload/v1537943055/uvmemwfwmjfl7pmv4upk.jpg",
            "secure_url" : "https://res.cloudinary.com/xplr-qa/image/upload/v1537943055/uvmemwfwmjfl7pmv4upk.jpg",
            "_id" : ObjectId("5bab260f97f85d07b9235a20")
        },
        {
            "public_id" : "zztqwdbl7ejccxmougad",
            "version" : 1537943055,
            "signature" : "bcb413431d518b243d801f92ff9cf0a8f9bd7682",
            "width" : 1920,
            "height" : 1080,
            "format" : "jpg",
            "resource_type" : "image",
            "url" : "http://res.cloudinary.com/xplr-qa/image/upload/v1537943055/zztqwdbl7ejccxmougad.jpg",
            "secure_url" : "https://res.cloudinary.com/xplr-qa/image/upload/v1537943055/zztqwdbl7ejccxmougad.jpg",
            "_id" : ObjectId("5bab260f97f85d07b9235a1f")
        }
    ],
    "organisationFlag" : false,
    "xperienceSubCategory" : [
        ObjectId("5b616b4c9e866d6453fef3eb")
    ],
    "description" : "Global Vipassana Pagoda is an expression of our gratitude towards the Buddha who strived for incalculable aeons to reach Supreme Enlightenment.",
    "__v" : 4,
    "price" : 800,
    "source" : "",
    "meetingLocation" : [],
    "coordinates" : [
        72.955162,
        19.172098
    ],
    "primaryLocation" : ObjectId("5bacb0192e0b2751f0f7f057"),
    "purchaseCount" : 20,
    "Xpert" : [
        {
            "_id" : ObjectId("5b518101752982066a0dcc08"),
            "name" : {
                "last" : "Bourdain",
                "first" : "Anthony"
            }
        },
        {
            "_id" : ObjectId("5b51b054054a962cc6f914db"),
            "name" : {
                "last" : "Yane",
                "first" : "Sid"
            }
        },
        {
            "_id" : ObjectId("5b51c00597199d3ec4953e68"),
            "name" : {
                "last" : "ipsum",
                "first" : "Lorem"
            }
        },
        {
            "_id" : ObjectId("5b59a8cdca722c3177cf3e63"),
            "name" : {
                "last" : "Lorem",
                "first" : "Test"
            }
        },
        {
            "_id" : ObjectId("5b5eea6e2d4b6a04b2d9d599")
        },
        {
            "_id" : ObjectId("5b5f02e22d4b6a04b2d9d5f1")
        },
        {
            "_id" : ObjectId("5b60364f9e866d6453fef3ea"),
            "name" : {
                "last" : "Lorem",
                "first" : "ipsum"
            }
        },
        {
            "_id" : ObjectId("5b6d70f96aaf19087ac6d9e9"),
            "name" : {
                "first" : "Indrajit",
                "last" : "Jadhav"
            }
        },
        {
            "_id" : ObjectId("5b6d81953da5c50974642974"),
            "name" : {
                "last" : "Lorem",
                "first" : "shin"
            }
        },
        {
            "_id" : ObjectId("5b6d831f3da5c50974642975"),
            "name" : {
                "last" : "Lorem",
                "first" : "Shin "
            }
        },
        {
            "_id" : ObjectId("5b6d83b83da5c50974642976"),
            "name" : {
                "last" : "wert",
                "first" : "fadsg"
            }
        },
        {
            "_id" : ObjectId("5b6d83ee3da5c50974642977"),
            "name" : {
                "last" : "asdfsaf",
                "first" : "sadf"
            }
        },
        {
            "_id" : ObjectId("5b7ba46cd0e5fa137805552b"),
            "name" : {
                "first" : "Vivek",
                "last" : "Pandey"
            }
        },
        {
            "_id" : ObjectId("5b7bb359d0e5fa13780555a9"),
            "name" : {
                "first" : "theamalageeks",
                "last" : "null"
            }
        },
        {
            "_id" : ObjectId("5b7bd19ed0e5fa137805565d"),
            "name" : {
                "first" : "Anikesh",
                "last" : "Baburanjan"
            }
        },
        {
            "_id" : ObjectId("5b7fa359211f5649518ae311"),
            "name" : {
                "first" : "Akhsay",
                "last" : "Gaikwad"
            }
        },
        {
            "_id" : ObjectId("5b80181fab8747537011be5c"),
            "name" : {
                "first" : "Sagar",
                "last" : "Bisen"
            }
        },
        {
            "_id" : ObjectId("5b83f1c5de663c0dcccfb483"),
            "name" : {
                "first" : "INDRAJIT",
                "last" : "JADHAV"
            }
        },
        {
            "_id" : ObjectId("5b92154efc790f18121f9e02"),
            "name" : {
                "first" : "sagar",
                "last" : "bisen"
            }
        },
        {
            "_id" : ObjectId("5ba39c509350135c9951ecb6"),
            "name" : {
                "first" : "Anikesh",
                "last" : "Baburajan"
            }
        },
        {
            "_id" : ObjectId("5ba3b8e79350135c9951ecb7"),
            "name" : {
                "first" : "Anurag",
                "last" : "Banerjee"
            }
        },
        {
            "_id" : ObjectId("5ba3c14e9350135c9951ecb8"),
            "name" : {
                "first" : "Dave",
                "last" : "Jhala"
            }
        },
        {
            "_id" : ObjectId("5ba4dfcf6bb5277e1d7db2af"),
            "name" : {
                "first" : "Mark",
                "last" : "Henry"
            }
        },
        {
            "_id" : ObjectId("5ba4e1c0452d7e01ce3dd34e"),
            "name" : {
                "first" : "Ankita",
                "last" : "Mestry"
            }
        },
        {
            "_id" : ObjectId("5ba7795b452d7e01ce3dd34f"),
            "name" : {
                "first" : "Abhishek",
                "last" : "Gupta"
            }
        },
        {
            "_id" : ObjectId("5ba9ec5844996a4be81a0c12"),
            "name" : {
                "first" : "Neeti",
                "last" : "Patil"
            }
        },
        {
            "_id" : ObjectId("5baa1abf44996a4be81a0c13"),
            "name" : {
                "first" : "Krishna",
                "last" : "S"
            }
        },
        {
            "_id" : ObjectId("5bb481d4c77dd914de2cb2f7"),
            "name" : {
                "first" : "krishna",
                "last" : "shetty"
            }
        }
    ]
}


而不是在Xpert中获得多个Xperts
现在我想将Xpert字段_id与输出的xpert字段进行匹配

最佳答案

使用以下聚合。

使用$lookup管道变体。让expression检查xpert的数组类型,如果不是则转换为array。 $match收集所有匹配的用户文档。 $project以从用户文档输出名称。

db.uniquexperiences.aggregate([
  {"$sample":{"size":2}},
  {"$lookup":{
    "from":"users",
    "let":{"xpert":{"$cond":[{"$isArray":"$xpert"},"$xpert",["$xpert"]]}},
    "pipeline":[
      {"$match":{"$expr":{"$in":["$_id","$$xpert"]}}},
      {"$project":{"name":1}}],
      "as":"Xpert"
  }}
])

关于node.js - 如何在MongoDB聚合使用的$ lookup内部进行匹配?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52754907/

10-12 15:14