MongoDB学习笔记~根据子集合里某个属性排序

时间:2023-03-09 01:30:17
MongoDB学习笔记~根据子集合里某个属性排序

回到目录

这个问题是这样的,有一个实体dog,里面有集合属性DogHistory,它里面有一些自己的属性,其中一个是SortNum,主要用来进行排序,而且这个排序可以影响主对象,即影响dog类,这个在mongodb里不容易实现,但也不是不能实现,我们需要分两步考虑这个问题,不过首先我们需要知道,mongodb里不支持子集合对象的子属性排序,但它支持子实体对象的子属性排序。

下面看一下数据结构

public class DogHistory
{
public bool IsHealth { get; set; }
public Adderss Adderss { get; set; }
public string HistoryName { get; set; }
public string[] Foods { get; set; }
public int SortNum { get; set; }
}
public class Dog : NoSqlEntity
{
public Des Des { get; set; }
public string Title { get; set; }
public string Type { get; set; }
public string[] Foods { get; set; }
public List<DogHistory> DogHistory { get; set; }
}

其中Dog类子实体属性Des,它里面有属性sortNum,如果我们去排序,那是完全没有问题的,代码如下

           Console.WriteLine("--------------------子实体对象");
var model3 = MongoDbClient.MongoManager<Dog>.Instance
.Find(Builders<Dog>.Filter.Eq("DogHistory.HistoryName", "毛仔"))
.SortBy(i => i.Des.SortNum).ToList();
model3.ToList().ForEach(i =>
{
Console.WriteLine(i.Title + ":" + i.Title + ",sort:" + i.Des.SortNum);
});

但如果希望根据DogHistory集合里的某个属性进行排序,那是不行的,虽然不行,但mongodb给出来了解决方案,对于集合类型可以通过索引下标的方式进行排序,这它是支持的

下面代码展现了如何实现这种复杂的排序:

            var entityIndex = MongoDbClient.MongoManager<Dog>.Instance.Find(Builders<Dog>.Filter.Eq("DogHistory.HistoryName", "大毛")).FirstOrDefault();
var index = entityIndex.DogHistory.FindIndex(i => i.HistoryName == "大毛");
var model2 = MongoDbClient.MongoManager<Dog>.Instance
.Find(Builders<Dog>.Filter.Eq("DogHistory.HistoryName", "大毛"))
.SortBy(i => i.DogHistory[index].SortNum);
model2.ToList().ForEach(i =>
{
Console.WriteLine(i.Title + ":" + i.DataStatus);
});

结果与我们预期的一样,当然,如果是简单的字符数组类型,也是可以通过对数据下标元素排序的,呵呵。

测试结果:

aaarticlea/png;base64,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" alt="" />

回到目录