如何比较匹配另一个数组的所有项目的 Mongo 数组,无论它在 C# 中的顺序如何?

How to compare a Mongo array that matches all items of another array no matter it's order in C#?

我正在使用 Equals(obj) 方法,但它无法正常工作,因为数据库中的数组元素未排序。如果顺序不同,则不认为是匹配元素。

我尝试了 that solution 两种方式:

var filteredObj = objects.Find(obj => obj.Elements.OrderBy(x => x).Equals(elements)).FirstOrDefault();
var filteredObj = objects.Find(obj => obj.Elements.OrderBy(x => x).Equals(elements)).FirstOrDefault();

但是在他们两个中我都得到以下异常:
Unsupported filter: {document}{Elements}.Equals(value(System.Collections.Generic.List[System.Int32]).OrderBy(x => x)).
MongoDb驱动好像不支持那种东西。

负责的方法:

public string GetIdByElements(List<int> elements)
{
    var filteredObj = objects.Find(obj => obj.Elements.Equals(elements)).FirstOrDefault();

    if (filteredObj is null)
        throw new ObjectNotFoundException("Object not found");
    return filteredObj.Id.ToString();
}

您可以将此 Find 查询与 $setEquals 运算符一起使用,如下所示。假设 MongoDB 集合的数组字段名称 arrayField:

var elements = new List<int>() { 1, 34, 900 };    // input list
var bsonElements = new BsonArray(elements);
var query = 
    new BsonDocument("$expr",
           new BsonDocument("$setEquals", 
               new BsonArray {
                    "$arrayField",
                     bsonElements
                
           })
);

var doc = collection.Find(query).FirstOrDefault();
Console.WriteLine(doc);    // doc is of type BsonDocument

带有数组字段的示例集合文档:{ "arrayField" : [ 1, 33, 900 ] }mongo shell 中的查询使用 $setEquals 运算符匹配数组元素(元素的顺序无关紧要):

db.collection.find( { $expr: { $setEquals: [ "$arrayField", [ 1, 900, 33 ] ] } } )