如何查找所有文档,直到在mongodb中满足条件

如何查找所有文档,直到在mongodb中满足条件

问题描述:

我想查找()集合中的任何文档从skip值到条件的极限值,而不是所有文档。例如,我想要获取所有文档直到我找到第五个黑头发的人。不只是五个黑头发的人。我怎样才能做到这一点在MongoDB中? 谢谢!如何查找所有文档,直到在mongodb中满足条件

+0

所以你去什么5,10,15,20,25 ...等,你想检查是否在第5,10 ,15号......等文件的人有黑头发? –

+0

不,我只想得到所有人,直到我得到第五个黑发人。因此,我的新系列中将会有许多非黑发人士加上五位黑发人士。 –

+0

只需迭代游标,直到找到所需的数字。这是一个简单的循环,当匹配数等于查找时,你简单地“断开”。 –

获取开始/结束ID,然后获取该范围的文档。假设你想要第一个人和第五个人之间的连续黑头发的人:

var start = db.persons.find({"hair": "black"}).sort({_id:1}).limit(1).toArray()[0]._id; 
var end = db.persons.find({"hair": "black"}).sort({_id:1}).skip(4).limit(1).toArray()[0]._id; 
db.persons.find({"_id": {$gte: start, $lte: end }}) 

从你的斯巴达描述我不能告诉你的数据是什么样子,你想保留什么信息,但肯定这是不可能的查找查询。你看起来比较集中。 如果您的数据是这样的:

/* 1 */ 
{ 
    "_id" : ObjectId("59ebda414d8a2fe38bec0e36"), 
    "color" : "black", 
    "name" : "Tim" 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("59ebda414d8a2fe38bec0e38"), 
    "color" : "blond", 
    "name" : "Tom" 
} 

/* 3 */ 
{ 
    "_id" : ObjectId("59ebda414d8a2fe38bec0e3a"), 
    "color" : "black", 
    "name" : "Jack" 
} 

/* 4 */ 
{ 
    "_id" : ObjectId("59ebda414d8a2fe38bec0e3c"), 
    "color" : "black", 
    "name" : "Frank" 
} 

/* 5 */ 
{ 
    "_id" : ObjectId("59ebda414d8a2fe38bec0e3e"), 
    "color" : "black", 
    "name" : "Peter" 
} 

/* 6 */ 
{ 
    "_id" : ObjectId("59ebda414d8a2fe38bec0e40"), 
    "color" : "blond", 
    "name" : "Jon" 
} 

/* 7 */ 
{ 
    "_id" : ObjectId("59ebda414d8a2fe38bec0e42"), 
    "color" : "black", 
    "name" : "Apollo" 
} 

/* 8 */ 
{ 
    "_id" : ObjectId("59ebda414d8a2fe38bec0e44"), 
    "color" : "black", 
    "name" : "Zeus" 
} 

/* 9 */ 
{ 
    "_id" : ObjectId("59ebda414d8a2fe38bec0e46"), 
    "color" : "blond", 
    "name" : "Daphne" 
} 

然后,你可以做这样的事情:

db.getCollection('hair').aggregate([ 
{ 
    $match: { 
     $or: [ 
      {color: "black"}, 
      {color: "blond"} 
     ] 
    } 
}, 
{ 
    $group: { 
     _id: "$color", // group by color 
     sum: {$sum: 1} // sum the occurrences of each color 
    } 
}, 
{ 
    $project: { 
     _id: 1, 
     sum: {$sum: { $cond: [ {$and : [ { $eq: [ "$_id", "black"] }, 
               { $gt: [ "$sum", 5] } 
            ] }, 
            5, 
            "$sum" ] }} 
    } 
} 
]) 

因此,正如我说的,我不知道你的文档的样子,什么样的信息你想保留和不保存。如果你需要全部的话,你也可以删除$match管道,但是请考虑那些没有使用索引的事实。