Как сравнить атрибуты разных объектов в массиве объектов mongodb - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть структура документа mongodb, как показано ниже:

{
"_id" : ObjectId("5b58673721b4b95a193d4e91"),
"pageId" : "page1",
"fields" : [ 
    {
        "fieldId" : "Field1",
        "value" : "test"
    }, 
    {
        "fieldId" : "Field2",
        "value" : 6.0
    },
    {
        "fieldId" : "Field3",
        "value" : 8.0
    }
]}

}

Я хочу найти все документы в коллекции, где значение для объекта, имеющего fieldId как 'Field2', равнобольше, чем значение для объекта, имеющего fieldId как 'Field3'.

т.е. Field2 (значение)> Field3 (значение)

Число объектов в массиве полей не является фиксированным.Я не могу сравнить по положению.Я должен сопоставить объекты по полю Id.Таким образом, в этом случае это должно быть на линии:Сравните: значение объекта где fieldId = 'Field2' со значением объекта где fieldId = 'Field3'

Как мне написать запрос MongoDB для этого?

Я использую MongoDB версии 4.0(Могут быть случаи, когда поля могут отсутствовать в документах. Например, документы, созданные до того, как эти поля были введены в проект)

1 Ответ

0 голосов
/ 04 февраля 2019

Предполагая, что у вас всегда есть два поля в документе, вы можете использовать приведенный ниже запрос в 3.6.

Найдите документ поля, используя indexofarray с fieldId в качестве критерия поиска, за которым следует сравнение значений.

db.collectionname.find(
{"$expr":{
  "$let":{
    "vars":{
      "field2":{"$arrayElemAt":["$fields",{"$indexOfArray":["$fields.fieldId","Field2"]}]},
      "field3":{"$arrayElemAt":["$fields",{"$indexOfArray":["$fields.fieldId","Field3"]}]}
    },
    "in":{"$gt":["$$field2.value","$$field3.value"]}}
}})
...