Сравнение поля последнего элемента массива с полем родительского документа

Мне нужно сравнить встроенное поле родительского документа со встроенным полем последнего документа (присутствующим внутри массива), которое также является частью родительского документа, и вернуть документы externalIds, когда эти два поля не совпадают.

Для справки вот изображения:
[Фактические метаданные, содержащие массив][1]
[Вот другое изображение, содержащее поле][2]

Итак, на втором изображении я действительно хочу, чтобы только последняя ревизия, т.е. последний документ в массиве ревизий, сравнивалась с родительским документом, а поле, которое нужно сравнить, это metadata.formData.mergeStatus.status.
Мне нужны те документы _id, в которых последний документ, присутствующий в массиве, имеет поле, отличное от соответствующего поля его родительского документа, если вообще существует массив ревизий.

Я новичок в mongodb и впервые спрашиваю в stackoverflow, поэтому, если вы сочтете это глупым, извините меня, однако вот моя попытка.

db.document.aggregate([
    { $match: { $and: [
        { spaceId: 3007 },
        { revisions: { $exists: true, $not: { $size: 0 } } }
    ] } },
    { $project:
        { _id: 1,
        spaceId:1,
        externalId:1,
        revisions: { $cond: {
            if: { $isArray: "$revisions" },
            then: { $size: "$revisions" },
            else: "NA" } },
        last: { $arrayElemAt: [ "$revisions", -1 ] },
        difference: { $ne: [
            "last.metadata.formData.mergeStatus.status", 
            "metadata.formData.mergeStatus.status" ] }
        }
    }
]); 

The above suggestion really helps however i am confused for below scenario,
so the metadata field contains elementsData and inside of that is another embedded object signature, which has two string fields 
1.userSignatureDate(String)
2.userSignatureText(String)
so when i have applied above logic to compare the *userSignatureDate* of parent metadata with respective field in last document of  the revisions array.it is not giving actual results.
here is the image for the code that i had written and the sample metadata Structure .[][3][][4]


  [1]: https://i.stack.imgur.com/rsrKv.png
  [2]: https://i.stack.imgur.com/y6wsp.png
  [3]: https://i.stack.imgur.com/398I8.png
  [4]: https://i.stack.imgur.com/PYUAL.png
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
0
42
1

Ответы 1

Попробуйте что-то подобное

db.getCollection('test').aggregate([
{$project:
      {
          status: "$metadata.formData.mergeStatus.status", 
          last_revisions: { $arrayElemAt: [ "$revisions", -1 ] }
      }},
{$project:
    {
        matched:{
            $eq:[
            "$status",
            "$last_revisions.metadata.formData.mergeStatus.status"
            ]}
       }}
])

Можете ли вы, @Imran, увидеть приведенное выше редактирование и предложить что-нибудь.

Ashok 11.03.2019 17:59

Другие вопросы по теме