如何获取MongoDB中的最后n个子文档?
How to get last n subdocument in MongoDB?
我想找一个Id=A的文档,然后排序并取出文档A里面的子文档。
但我找不到任何解决方案,尤其是在 MongoDB.Driver for c# 中。
在文档级别,我们有这样的查询:
db.foo.find().sort({_id:1}).limit(50);
但是我需要为子文档应用限制功能,而不是文档。
以这个模型为例:
{
"_id" : "10000",
"password" : "password1",
"name" : "customer1",
"channels" : [
{
"id" : "1",
"name" : "cust1chan1",
"enabled" : true
},
{
"id" : "2",
"name" : "cust1chan2",
"enabled" : true
},
{
"id" : "3",
"name" : "cust1chan2",
"enabled" : true
},
{
"id" : "4",
"name" : "cust1chan2",
"enabled" : true
},...
]}
我希望我的结果与此类似:
{
"_id" : "10000",
"password" : "password1",
"name" : "customer1",
"channels" : [
{
"id" : "1",
"name" : "cust1chan1",
"enabled" : true
},
{
"id" : "2",
"name" : "cust1chan2",
"enabled" : true
}
]}
我找到了解决办法。我们可以使用 Projection 中的 Slice 函数。像这样:
var filter = Builders<Foo>.Filter.Where(p => p.Id == fooId);
var slice = Builders<Foo>.Projection.Slice(p => p.Channels, 0, 2);
var sort = Builders<Foo>.Sort.Descending("Foo.Channels");
var articleDocument = _collectionFoo.Find(filter).Sort(sort).Project<Foo>(slice).FirstOrDefault();
我想找一个Id=A的文档,然后排序并取出文档A里面的子文档。 但我找不到任何解决方案,尤其是在 MongoDB.Driver for c# 中。 在文档级别,我们有这样的查询:
db.foo.find().sort({_id:1}).limit(50);
但是我需要为子文档应用限制功能,而不是文档。
以这个模型为例:
{
"_id" : "10000",
"password" : "password1",
"name" : "customer1",
"channels" : [
{
"id" : "1",
"name" : "cust1chan1",
"enabled" : true
},
{
"id" : "2",
"name" : "cust1chan2",
"enabled" : true
},
{
"id" : "3",
"name" : "cust1chan2",
"enabled" : true
},
{
"id" : "4",
"name" : "cust1chan2",
"enabled" : true
},...
]}
我希望我的结果与此类似:
{
"_id" : "10000",
"password" : "password1",
"name" : "customer1",
"channels" : [
{
"id" : "1",
"name" : "cust1chan1",
"enabled" : true
},
{
"id" : "2",
"name" : "cust1chan2",
"enabled" : true
}
]}
我找到了解决办法。我们可以使用 Projection 中的 Slice 函数。像这样:
var filter = Builders<Foo>.Filter.Where(p => p.Id == fooId);
var slice = Builders<Foo>.Projection.Slice(p => p.Channels, 0, 2);
var sort = Builders<Foo>.Sort.Descending("Foo.Channels");
var articleDocument = _collectionFoo.Find(filter).Sort(sort).Project<Foo>(slice).FirstOrDefault();