#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'
}}]