Поиск в MongoDB соответствует двум значениям - PullRequest
1 голос
/ 22 мая 2019

У меня есть две коллекции, теннис matches с двумя игроками и players.

matches выглядит так:

{ 
    "_id" : ObjectId("5ce51febc6dd820a820f20a5"), 
    "players" : [
        ObjectId("5ce51c1af3cd6009a171a5b3"), 
        ObjectId("5ce51c1af3cd6009a171a350")
    ], 
    "result" : "4:6 6:3 7:6(7) 7:6(8)"    
},
{ 
    "_id" : ObjectId("5ce51febc6dd820a820f20a6"), 
    "players" : [
        ObjectId("5ce51c1af3cd6009a171a005"), 
        ObjectId("5ce51c1af3cd6009a171a16c")
    ], 
    "result" : "6:2 4:6 6:3"    
},
[...]

и players вот так:

{ 
    "_id" : ObjectId("5ce51c1af3cd6009a171a5b3"),               
    "name" : "Serena Williams",         
    "country" : "USA"         
},
{
    "_id" : ObjectId("5ce51c1af3cd6009a171a350"),               
    "name" : "Garbiñe Muguruza",         
    "country" : "Spain"         
},
[...]

Мне нужны все matches, где players[0] равно имени и players[1] другому имени.

Я пробовал это безуспешно:

db.matches.aggregate([
  {
    $unwind: "$players"
  },
  {
    $lookup: {
      from: "players",
      localField: "players",
      foreignField: "_id",
      as: "tmp_join"
    }
  },
  {
    $match: {
      "tmp_join.name": ["Serena Williams","Garbiñe Muguruza"]
    }
  }
])

1 Ответ

1 голос
/ 22 мая 2019

Сначала вам нужно $unwind массив tmp_join, а затем вы можете использовать $in, чтобы найтидокументы содержат имя.

db.matches.aggregate([
  { "$lookup": {
    "from": "players",
    "localField": "players",
    "foreignField": "_id",
    "as": "tmp_join"
  }},
  { "$unwind": "$tmp_join" },
  { "$match": {
    "tmp_join.name": {
      "$in": ["Serena Williams","Garbiñe Muguruza"]
    }
  }}
])

Используйте агрегацию ниже, если вы используете mongodb 3.6 и выше

db.matches.aggregate([
  { "$lookup": {
    "from": "players",
    "let": { "players": "$players" },
    "pipeline": [
      { "$match": {
        "$expr": { "$in": ["$_id", "$$players"] },
        "name": { "$in": ["Serena Williams", "Garbiñe Muguruza"] }
      }}
    ],
    "as": "tmp_join"
  }},
  { "$match": { "$expr": { "$gt": [{ "$size": "$tmp_join" }, 1] }}}
])
...