Mongo C# 驱动程序对 $search 聚合中的复合 Must 子句进行 Bson 序列化失败

问题描述 投票:0回答:1

我有一个 Atlas Search 索引,并且我正在使用 MongoDb Compass 来编写

$search
聚合,我能够使用以下语法并成功从 Compass 返回结果:

{
  index: "ShipmentProjections",
  compound: {
    must: {
      equals: {
        value: 208414,
        path: "MerchantId",
      },
    },
    must: {
      in: {
        path: "ShipmentId",
        value: [100405234]
      }
    }
  },
}

我的问题是我无法将此查询转换为 C#。我正在使用 MongoDb C# Bson 驱动程序(Nuget:

MongoDb.Bson 2.23.2
),但是当我尝试将此查询传递到
BsonDocument.Parse(searchQuery)
时,出现以下错误:

System.InvalidOperationException: Duplicate element name 'must'.
   at MongoDB.Bson.BsonDocument.Add(BsonElement element)
   at MongoDB.Bson.BsonDocument.Add(String name, BsonValue value)
   at MongoDB.Bson.Serialization.Serializers.BsonDocumentSerializer.DeserializeValue(BsonDeserializationContext context, BsonDeserializationArgs args)
   at MongoDB.Bson.Serialization.Serializers.BsonValueSerializerBase`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
   at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
   at MongoDB.Bson.Serialization.Serializers.BsonValueSerializer.DeserializeValue(BsonDeserializationContext context, BsonDeserializationArgs args)
   at MongoDB.Bson.Serialization.Serializers.BsonValueSerializerBase`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
   at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
   at MongoDB.Bson.Serialization.Serializers.BsonDocumentSerializer.DeserializeValue(BsonDeserializationContext context, BsonDeserializationArgs args)
   at MongoDB.Bson.Serialization.Serializers.BsonValueSerializerBase`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
   at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
   at MongoDB.Bson.BsonDocument.Parse(String json)

但是,似乎在

must
语句中包含重复的
compound
元素是查询所需的格式。

似乎

$search
阶段所要求的语法与C#驱动程序中BsonDocument键的唯一性约束之间存在冲突。

从我测试从 Compass 编写查询的各种方法中,我发现:

  • must
    子句只能包含一个条件(并且
    and
    似乎不是
    must
    中的有效选项)
  • compound
    声明也不支持
    and
  • 因此,我能够使此查询通过验证的唯一方法是在
    must
    下嵌套两个不同的
    compound
    键,并在每个
    must
    语句中嵌套一个条件

有没有办法让 C# 驱动程序中的 BsonDocument 接受此搜索查询及其重复的必须键?是否有其他方法可以编写相同的查询来避免重复键问题?

感谢您的帮助!

c# mongodb bson mongodb-atlas-search bsondocument
1个回答
0
投票

啊哈,从另一个板上找到的答案。就像将

must
子句转换为数组一样简单。

compound: {
    must: [
      {
        equals: {
          value: 208414,
          path: "MerchantId",
        },
      },
      {
        in: {
          path: "ShipmentId",
          value: [10654081],
        },
      }
    ]
  },
© www.soinside.com 2019 - 2024. All rights reserved.