首页 > 解决方案 > 当列表中某个项目的字段值与另一个项目的不同字段值匹配时查询 MondoDB 集合

问题描述

我有一个集合,mongoDB其中记录类似于以下内容(示例数据),其中最新版本与增量值一起存储在名为“版本”的字段中,并为历史数据的项目复制一个_id作为resourceId的副本。此处记录 1、2、3 是同一记录,但版本和状态不同。所以我需要找到一个项目id与其他记录匹配recourseId并且状态为“已发布”的所有记录以及其他记录。在这种情况下,我的输出应该只有记录 4,因为虽然记录 3 的版本最高,但状态没有发布。在这种情况下,我没有显示任何记录 1 或 2 或 3。MongoDB使用c#.netor时如何实现这一点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

这没有用。不确定如何在此处添加“状态”检查。

标签: c#mongodbvb.netmongodb-querymongodb-.net-driver

解决方案


查询需要的不仅仅是标准$lookup。首先,我尝试按如下方式创建pipelinein ,然后将其翻译成.MongoDB CompassVB.Net

查询首先检查是否存在三个属性字段值。然后它按版本降序对文档进行排序。然后它按与resourceId匹配的_id对文档进行分组。然后该组被赋予不同的名称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'
}}]

推荐阅读