简体   繁体   English

如何从另一个Array MongoDB中的一个数组计算匹配元素

[英]How to count matched elements from an Array in another Array MongoDB

I am using the MongoDB Aggregate framework to query a users collection. 我正在使用MongoDB Aggregate框架来查询用户集合。

This is the is an example of the user schema layout below: 这是下面的用户架构布局的示例:

{
    "_id" : ObjectId("XXXXXXXXXXXXXX367db"),
        "updatedAt" : ISODate("2017-08-18T10:59:54.904Z"),
            "createdAt" : ISODate("2017-08-18T10:59:54.904Z"),
                "email" : "fake57@gmail.com",
                    "firstName" : "Tianna.",
                        "gender" : "male",
                            "geometry" : {
        "coordinates" : [
            -6.26119,
            53.35247
        ],
            "_id" : ObjectId("5996c8a9a4d84d3639c367dc"),
                "type" : "point"
    },
    "age" : 25,
        "personalAttributes" : [
            "ksjdnksajdna",
            "ksjdssacasca",
            "xz12nksajdna",
            "xz12nksaxxna",
            "xz12nksaxxxx",
            "xz12nwwzwwwa",
            "xz12nkslkmna",
        ]
}

This is steps outlined in the aggregate pipeline. 这是聚合管道中概述的步骤。

1: Geolocate users within a specified distance using the $geoNear operator. 1:使用$ geoNear运算符在指定距离内定位用户。

2: Match the users based on gender. 2:根据性别匹配用户。

db.getCollection('users').aggregate([
    {
        "$geoNear": {
            "near": {
                "type": "Point",
                "coordinates": [
                    -6.26030969999999,
                    53.3498053
                ]
            },
            "distanceField": "dist.calculated",
            "spherical": true,
            "maxDistance": 770000
        }
    },
    {
        "$match": {
            "gender": "male"
        }
    }
])

What I want to do is pass another users personalAttributes Array and count the number of matched items in each array .It would look something like this: 我想要做的是传递另一个用户的personalAttributes数组并计算每个数组中匹配项的数量。看起来像这样:

db.getCollection('users').aggregate([
    {
        "$geoNear": {
            "near": {
                "type": "Point",
                "coordinates": [
                    -6.26030969999999,
                    53.3498053
                ]
            },
            "distanceField": "dist.calculated",
            "spherical": true,
            "maxDistance": 770000
        }
    },
    {
        "$match": {
            "gender": "male"
        }
    },
    {
        "$project": {
            "_id": 1,
            "gender": 1,
            "firstName": 1,
            "profileImage": 1
                "personalAttributesMatches": {
                //Pass in the users personalAttributes Array and count the number of matches and return all the data. 
                }
        }
    }

 }
])

With the expected output to be 与预期的输出是

/* 1 */
{
    "_id" : ObjectId("5996c8aaa4d84d3639c36a61"),
    "firstName" : "Sharon",
    "gender" : "male",
    "personalAttributesMatches": 15
}

/* 2 */
{
    "_id" : ObjectId("5996c9c41daf273658715fcf"),
    "firstName" : "Hilton",
    "gender" : "male",
    "personalAttributesMatches": 11
}

/* 3 */
{
    "_id" : ObjectId("5996c6d66f8910361b8232b5"),
    "firstName" : "Eliezer",
    "gender" : "male",
    "personalAttributesMatches": 7
}

Insights into this would be much appreciated!! 对此的见解将不胜感激!!

You can make use of setIntersection expression, so your project stage can look like following: 您可以使用setIntersection表达式,因此您的项目阶段如下所示:

"$project": {
    "_id": 1,
    "gender": 1,
    "firstName": 1,
    "profileImage": 1,
    "personalAttributesMatches": {
        $size:{
            $setIntersection: ["$personalAttributes", _other_persons_attributes_]
        }
    } 
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM