2017-10-21 145 views
1

我想查找()集合中的任何文檔從skip值到條件的極限值,而不是所有文檔。例如,我想要獲取所有文檔直到我找到第五個黑頭髮的人。不只是五個黑頭髮的人。我怎樣才能做到這一點在MongoDB中? 謝謝!如何查找所有文檔,直到在mongodb中滿足條件

+0

所以你去什麼5,10,15,20,25 ...等,你想檢查是否在第5,10 ,15號......等文件的人有黑頭髮? –

+0

不,我只想得到所有人,直到我得到第五個黑髮人。因此,我的新系列中將會有許多非黑髮人士加上五位黑髮人士。 –

+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 }}) 
0

從你的斯巴達描述我不能告訴你的數據是什麼樣子,你想保留什麼信息,但肯定這是不可能的查找查詢。你看起來比較集中。 如果您的數據是這樣的:

/* 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管道,但是請考慮那些沒有使用索引的事實。