MongoDB: сравнение полей в массиве вложенных документов без $ unwind? - PullRequest
0 голосов
/ 18 января 2019

Предположим, у меня есть документ, содержащий массив встроенных документов с такой же структурой:

{
    "_id": ObjectId('5c41c2a3c3238118a0950a7b'),
    "subdocuments": [
        {
            "_id": ObjectId('5c41c2b4c3238118a0950a7c'),
            "field1: "A",
            "field2: "A"
        },
        {
            "_id": ObjectId('5c41c2b6c3238118a0950a7d'),
            "field1: "B",
            "field2: "C"
        }
    ]
}

Я хочу сравнить field1 и field2 в одном и том же поддокументе и спроецировать результат внутри этого поддокумента, т. Е .:

{
    "_id": ObjectId('5c41c2a3c3238118a0950a7b'),
    "subdocuments": [
        {
            "_id": ObjectId('5c41c2b4c3238118a0950a7c'),
            "field1: "A",
            "field2: "A",
            "fields_equal": true
        },
        {
            "_id": ObjectId('5c41c2b6c3238118a0950a7d'),
            "field1: "B",
            "field2: "C",
            "fields_equal": false
        }
    ]
}

Я хотел бы сделать это без необходимости раскручивать subdocuments. Это не работает:

'$addFields': {
    'subdocuments.fields_equal': {
        '$eq': ['$subdocuments.field1','$subdocuments.field2']
    }
}

Есть идеи, как это сделать? Или даже если это возможно?

Ответы [ 2 ]

0 голосов
/ 19 января 2019
db.collection.aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $unwind: {
                path: "$subdocuments",

            }
        },

        // Stage 2
        {
            $addFields: {
                "subdocuments.fields_equal": {
                    $cond: {
                        if: {
                            $eq: ["$subdocuments.field1", "$subdocuments.field2"]
                        },
                        then: true,
                        else: false
                    }
                }
            }
        },

        // Stage 3
        {
            $group: {
                _id: '$_id',
                subdocuments: {
                    $addToSet: '$subdocuments'
                }
            }
        },

    ]



);
0 голосов
/ 18 января 2019

Запустите эту агрегацию.

db.collection.aggregate([{
  '$addFields': {
    'subdocuments': {
      $map: {
        input: "$subdocuments",
        in: {
          $mergeObjects: [{
              fields_equal: { $eq: ["$$this.field1", "$$this.field2"] }
            },
            "$$this"
          ]
        }
      }
    }
  }
}])
...