如何比较匹配另一个数组的所有项目的 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 ] ] } } )
我正在使用 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 ] ] } } )