我如何查询任何对象的whos数组包含名称不区分大小写匹配的播放器? db.collection.find(players.name: search)
这是数据存储方式的示例对象(我已删除了与问题无关的所有字段)。
{ "_id" : ObjectId("5d67f29ae6504b451c3aca3e"), "players" : [
{ "name" : "Jenny"}, { "name" : "Benny"}, { "name" : "Kenny" } ] }
一种解决方案是只遍历集合中的所有文档,然后依次遍历每个文档中的所有名称,但我试图避免这种情况。另一个可能是将名称映射到objectIds?
答案 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);
});