如何查询数组中的元素?

时间:2019-08-29 17:55:16

标签: node.js mongodb

我如何查询任何对象的whos数组包含名称不区分大小写匹配的播放器? db.collection.find(players.name: search)

这是数据存储方式的示例对象(我已删除了与问题无关的所有字段)。

{ "_id" : ObjectId("5d67f29ae6504b451c3aca3e"), "players" : [
 { "name" : "Jenny"}, { "name" : "Benny"}, { "name" : "Kenny" } ] }

一种解决方案是只遍历集合中的所有文档,然后依次遍历每个文档中的所有名称,但我试图避免这种情况。另一个可能是将名称映射到objectIds?

3 个答案:

答案 0 :(得分:1)

这是我的,显然更传统,接受它。我不知道该语言中是否存在像您自己的答案这样的构造,我必须做一些阅读。无论如何,我们开始。

function find_player( data, player_name )
{
    return data.filter( (o) => {
        return o.players.find( (player) => {
            return player.name == player_name;
        });
    });
}

let objects = [
    { "_id" : "foo", "players" : [ { "name" : "Jenny"}, { "name" : "Benny"}, { "name" : "Kenny" } ] },
    { "_id" : "bar", "players" : [ { "name" : "Johnny"}, { "name" : "Bunny"}, { "name" : "Kinny" } ] }
];

let found = find_player(objects, "Kinny");

console.log( found[0]._id ); // bar

答案 1 :(得分:1)

您可以使用正则表达式执行此操作:

n = [i for i in range(5)]

答案 2 :(得分:0)

感谢$ elemMatch确实是解决方案。

dbo.collection('replays').find({ players: {
        $elemMatch: {name : {$regex: new RegExp('^'+ search + '$', "i") }} 
    }
}).toArray(function (err, res) {
    console.log(res);
});