Используйте $ или с вложенным массивом объектов в mongodb - PullRequest
0 голосов
/ 23 мая 2018

У меня есть следующая коллекция

[
  {"overlaps": [{"BB1": "itemA", "iou": 0.1,  "BB2": "itemB"},{"BB1": "itemB", "iou": 0.4,  "BB2": "itemC"}], "City": "Paris", "mode": "RGB","path": "photo1.png"},
  {"overlaps": [{"BB1": "itemA", "iou": 0.5,  "BB2": "itemC"}], "City": "London", "mode": "RGB","path": "photo2.png"},
  {"overlaps": [{"BB1": "itemB", "iou": 0.8,  "BB2": "itemB"}], "City": "London", "mode": "greyscale","path": "photo3.png"},
  {"overlaps": [{"BB1": "itemA", "iou": 0.2,  "BB2": "itemC"},{"BB1": "itemA", "iou": 0.8,  "BB2": "itemC"}], "City": "Berlin", "mode": "RGB","path": "photo4.png"},
  {"overlaps": [{"BB1": "itemA", "iou": 0.9,  "BB2": "itemB"}], "City": "NY", "mode": "greyscale","path": "photo5.png"},
  {"overlaps": [{"BB1": "itemA", "iou": 0.8,  "BB2": "itemB"}], "City": "Roma", "mode": "RGB","path": "photo6.png"}
]

Я хочу получить документы, которые

  • имеют город = Берлин

  • ИЛИ иметь режим = оттенки серого

  • ИЛИ как минимум одно перекрытие между "BB1": "itemA" и "BB2": "itemC"

Первые 2 условия просты:

cursor = record1.find({"$or": [{"City":"Berlin"},{"mode":"greyscale"}]}) 

Как добавить третье условие в запрос?

1 Ответ

0 голосов
/ 23 мая 2018

Вам необходимо применить $elemMatch с условием $or, чтобы получить результат

db.collection.find({
  $or: [{ City: "Berlin" }, { mode: "greyscale" },
    {
      overlaps: {
        $elemMatch: {
          $or: [
            {
              BB1: "itemA",
              BB2: "itemC"
            }
          ]
        }
      }
    }
  ]
})
...