我有一个 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 接受此搜索查询及其重复的必须键?是否有其他方法可以编写相同的查询来避免重复键问题?
感谢您的帮助!
啊哈,从另一个板上找到的答案。就像将
must
子句转换为数组一样简单。
compound: {
must: [
{
equals: {
value: 208414,
path: "MerchantId",
},
},
{
in: {
path: "ShipmentId",
value: [10654081],
},
}
]
},