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

Posted

技术标签:

【中文标题】如何计算另一个数组 MongoDB 中数组中的匹配元素【英文标题】:How to count matched elements from an Array in another Array MongoDB 【发布时间】:2018-01-27 08:40:17 【问题描述】:

我正在使用 MongoDB Aggregate 框架来查询用户集合。

这是以下用户架构布局的示例:


    "_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",
        ]

这是聚合管道中概述的步骤。

1:使用 $geoNear 运算符对指定距离内的用户进行地理定位。

2:根据性别匹配用户。

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

我想要做的是传递另一个用户的个人属性数组并计算每个数组中匹配项的数量。它看起来像这样:

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. 
                
        
    

 
])

预期输出为

/* 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

对此的见解将不胜感激!

【问题讨论】:

【参考方案1】:

您可以使用setIntersection 表达式,因此您的项目阶段可以如下所示:

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

【讨论】:

非常感谢我现在要在猫鼬框架上测试它!一旦我得到它的工作,我会将您的答案标记为正确。再次感谢!

以上是关于如何计算另一个数组 MongoDB 中数组中的匹配元素的主要内容,如果未能解决你的问题,请参考以下文章

如何匹配MongoDB中的子文档数组?

MongoDb:删除另一个数组中的数组索引[重复]

如何匹配 MongoDB 中嵌入式数组或文档中的字符串?

MongoDB - 仅投影数组中的匹配元素

MongoDB - 仅投影数组中的匹配元素

如何检查数组字段是不是包含唯一值或 MongoDB 中的另一个数组?