如何查找所有文档,直到在mongodb中满足条件
问题描述:
我想查找()集合中的任何文档从skip值到条件的极限值,而不是所有文档。例如,我想要获取所有文档直到我找到第五个黑头发的人。不只是五个黑头发的人。我怎样才能做到这一点在MongoDB中? 谢谢!如何查找所有文档,直到在mongodb中满足条件
答
获取开始/结束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
管道,但是请考虑那些没有使用索引的事实。
所以你去什么5,10,15,20,25 ...等,你想检查是否在第5,10 ,15号......等文件的人有黑头发? –
不,我只想得到所有人,直到我得到第五个黑发人。因此,我的新系列中将会有许多非黑发人士加上五位黑发人士。 –
只需迭代游标,直到找到所需的数字。这是一个简单的循环,当匹配数等于查找时,你简单地“断开”。 –