使用MongoDB $从哪里比较Array中的元素

时间:2017-09-22 17:33:46

标签: javascript arrays mongodb

假设我有两个以下的MongoDB文档:

{ 
"_id" : ObjectId(a59b0e19aff8a2ed2128bef97"), 
"name" : "John", 
"matches" : [
    {
        "name" : "Bob", 
        "count" : 10
    }, 
    {
        "name" : "John", 
        "count" : 20
    }, 
    {
        "name" : "Alice", 
        "count" : 30
    }
 ]
}


{ 
"_id" : ObjectId(b59b0e19aff8a2ed2128bef97"), 
"name" : "Mike", 
"matches" : [
    {
        "name" : "Bob", 
        "count" : 10
    }, 
    {
        "name" : "John", 
        "count" : 20
    }, 
    {
        "name" : "Alice", 
        "count" : 30
    }
 ]
}

我需要创建一个MongoDB查询来比较" name"使用" matches.name"。

在我的示例中,只有第一个文档会被匹配,因为" John"在"匹配"阵列。 第二个文档将不匹配,因为Mike不在数组中。

我尝试{$where : "this.matches.name == this.name"},但这不起作用。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我相信这可能就是您要查找的内容,aggregate查询matches.$.name以查看是否有任何匹配$name

db.collection.aggregate([{
            "$redact": {
                "$cond": [{
                        "$anyElementTrue": [{
                                "$map": {
                                    "input": "$matches",
                                    "as": "matches",
                                    "in": {
                                        "$eq": ["$$matches.name", "$name"]
                                    }
                                }
                            }
                        ]
                    },
                    "$$KEEP",
                    "$$PRUNE"
                ]
            }
        }
        ])

整齐地返回

{ 
    "_id" : ObjectId("59c54e6f505e2f07180e60f7"), 
    "name" : "John", 
    "matches" : [
        {
            "name" : "Bob", 
            "count" : 10.0
        }, 
        {
            "name" : "John", 
            "count" : 20.0
        }, 
        {
            "name" : "Alice", 
            "count" : 30.0
        }
    ]
}

答案 1 :(得分:-1)

您是否尝试过此功能查询方法?

db.myCollection.find( { $where: function() { return (this.matches.name == this.name) } } );

如果这适用于您的方案,请在此处发表评论:)