.net 在mongodb集合中通过数组中的id获取单个对象

8iwquhpp  于 2023-06-25  发布在  .NET
关注(0)|答案(1)|浏览(112)

我在Mongo数据库中有以下集合结构:

[{
  "_id": {
    "$oid": "number"
  },
  "OfferNumber": "string",
  "ComercialCode": "string",
  "ContractNumber": null,
  "FirstDocSent": {
    "$date": "date"
  },
  "EventDate": "date",
  "EndDate": "date",
  "LastMaintenance": {
    "$date": "date"
  },
  "UserMaintenance": "rny",
  "PurgePhysicalDocDate": {
    "$date": "date"
  },
  "StoredDocuments": [
    {
      "CodeEmission": "string",
      "ItemNumber": "string",
      "DocumentType": "number",
      "DocumentNumber": "number",
      "OriginSystemCode": "rny",
      "StoreDate": {
        "$date": "date"
      },
      "IdGed": "number",
      "IdS3": "number"
    }
  ]
}]

StoredDocuments数组包含表示具有唯一IdS3的文档的对象。
基于这个结构,我试图用C#实现一个查询,它只通过IdS3选择一个文档,但是我不能通过搜索所有数组并只返回一个对象来进行过滤。到目前为止,我实现的查询只选择父对象。有什么实施思路吗?先谢谢你了。

9jyewag0

9jyewag01#

我想你正在寻找类似this example的东西。
请注意,这个查询看起来很混乱,但$replaceRootnewRoot$arrayElemAt只是从数组中获取第一个元素并将其像对象一样输出。
查询的其余部分非常简单,使用$match进行第一次过滤,避免在每个文档中执行$filter。然后$filter,得到数组中的元素,其中IdS3等于你想要的数。
所以使用c#你可以尝试MongoDB Compass export to specific language提供的类似的东西(我不是c#Maven,但你被标记为.net-driver):

new BsonArray
{
    new BsonDocument("$match", 
    new BsonDocument("StoredDocuments.IdS3", 1)),
    new BsonDocument("$replaceRoot", 
    new BsonDocument("newRoot", 
    new BsonDocument("$arrayElemAt", 
    new BsonArray
                {
                    new BsonDocument("$filter", 
                    new BsonDocument
                        {
                            { "input", "$StoredDocuments" }, 
                            { "cond", 
                    new BsonDocument("$eq", 
                    new BsonArray
                                {
                                    "$$this.IdS3",
                                    1
                                }) }
                        }),
                    0
                })))
}

相关问题