Запрос коллекции MondoDB, когда значение поля элемента в списке совпадает с другим значением поля другого элемента

#c# #mongodb #vb.net #mongodb-query #mongodb-.net-driver

#c# #mongodb #vb.net #mongodb-запрос #mongodb-.net-driver

Вопрос:

У меня есть коллекция, в mongoDB которой записи похожи на следующие (пример данных), где последние версии хранятся с добавочным значением в поле с именем «версия» и копией _id as resourceId для элемента для исторических данных. Здесь запись 1, 2, 3 — это одна и та же запись с другой версией и статусом. Итак, мне нужно найти все записи, в которых один элемент id совпадает с другими записями recourseId , а статус «Опубликован» вместе с другими записями. В этом случае моим результатом должна быть только запись 4, потому что, хотя запись 3 имеет самую высокую версию, но статус не опубликован. В этом случае я не показываю ни одну из записей 1, 2 или 3. Как это может быть достигнуто при MongoDB использовании c#.net или vb.net ?

 1.  id:"11A"
    name: "Blue Block"
    status: "Published"
    version: "0"
    resourceId: ""
2.  id:"11B"
    name: "Blue Block"
    status: "Published"
    version: "1"
    resourceId: "11A"
3.  id:"11C"
    name: "Blue Block"
    status: "Draft"
    version: "2"
    resourceId: "11A"
4.  id:"11D"
    name: "Red Block"
    status: "Published"
    version: "0"
    resourceId: ""
 

Что я пробовал:

 Public Class Toy
    Public Property ID As String
    Public Property Name As String
    Public Property Status As String
    Public Property Version As String
    Public Property ResourceID As String
End class

Private Function GetToys() As List(Of Toy)
 
  Dim listOfToys = db.GetCollection(Of BsonDocument)("Toys").Aggregate().Match(Function(x) x.GetElement("id") = x.GetElement("resourceId")).SortByDescending(Function(x) x.GetElement("version")).Group(BsonDocument.Parse("{ 'id':'$group',  'latestvalue':{$first:'$value'} }")).ToList()

  Return listOfToys
End Function
 

Что не сработало. Не уверен, как добавить сюда проверку «Статус».

Комментарии:

1. Это стандартный вариант использования $lookup .

Ответ №1:

Запрос требовал большего, чем стандартный $lookup . Сначала я попытался создать pipeline in MongoDB Compass следующим образом, затем я перевел его в VB.Net .

Сначала запрос проверяет, существуют ли три значения поля свойства. Затем он сортирует документы по версии в порядке убывания. Затем он группирует документы по _id, где он соответствует resourceId. Тогда группе присваивается другое имя latestversion. Затем он сопоставляет вновь сгруппированные документы по статусу. Это ожидаемый результат.

Конвейер агрегирования MongoDBCompass:

 [{$match: {
$and: [
{
  status: {
    $exists: true
  }
},
{
  version: {
    $exists: true
  }
},
{
  resourceId: {
    $exists: true
  }
}
]
}}, {$sort: {
      version: -1
}}, {$group: {
      _id: '$resourceId',
      latestVersion: {
            $first: '$ROOT'
    }
 }}, {$match: {
     'latestVersion.status': {
     $eq: 'Published'
}
}}, {$replaceRoot: {
     newRoot: '$latestVersion'
}}]