如何找到所有文件,直到在mongodb遇到一个条件

时间:2017-10-21 10:29:41

标签: mongodb find

我想查找()集合中的任何文档,从跳过值到条件的限制值,而不是所有文档。例如,我希望得到所有人,直到找到第五个黑头发人。不只是五个黑头发的人。我怎么能在mongodb中做到这一点? 谢谢!

2 个答案:

答案 0 :(得分:1)

从您的简短描述中我无法分辨您的数据是什么样的以及您想要保留哪些信息,但是使用查询查询肯定无法做到这一点。你正在寻找聚合。 如果您的数据如下所示:

/* 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管道,但请考虑不使用索引这一事实。

答案 1 :(得分:1)

获取开始/结束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 }})