也許你可以使用一個子文檔,如:
{
array_sub_doc: { arr: [1,2,3,4,5] }
}
所以,你可以做比賽,如:
db.coll.ensureIndex({array_sub_doc:1});
db.coll.find({array_sub_doc: {arr:[1,2,3,4,5]}})
更新我發現了什麼導致了失敗的大陣列。大於800字節的索引鍵不會編入索引。所以,如果你有一個大的子文檔,並且你在其上放置了一個索引,如果它大於800字節,並且你試圖搜索它,你就不會找到它。如果您關閉索引並重新搜索相同的子文檔,您會發現它(儘管它將是完整的集合掃描)。
這在這裏是作爲一種限制,並會在以後的版本中刪除:https://jira.mongodb.org/browse/SERVER-3372
所以,這將在通用工作了小數組。
下面是一些測試代碼的情況下,任何人想嘗試一下:
var randomArray = function() {
var len = 80;
var randomarr = new Array();
for (var i=0; i<len; i++) {
randomarr.push(Math.floor(Math.random() *10000));
}
return randomarr;
}
var insert = function() {
db.Test2.ensureIndex({array_sub_doc:1});
for(var i=0;i<10000;i++) {
db.Test2.save({array_sub_doc: {arr: randomArray()}});
}
}
db.Test2.remove();
insert();
var one = db.Test2.findOne();
db.Test2.findOne({array_sub_doc:one.array_sub_doc});
//...
db.Test2.find({array_sub_doc:one.array_sub_doc}).explain(0);
/* outputs:
{
"cursor" : "BtreeCursor array_sub_doc_1",
"nscanned" : 1,
"nscannedObjects" : 1,
...
*/
我知道你已經打上了這個問題的回答但也有一些注意事項。你不明白的一件事是數組排序是'[1,2,3]'與搜索的'[1,3,2]'相同嗎?如果這兩個陣列是相同的,那麼下面的解決方案將失敗。如果這兩者不相同,那麼您可能需要測試序列化版本,因爲速度差異可能很大。 –
@GatesVP是的,那是真的。但在我看來,這不是一個精確的數組匹配。爲了匹配這些數組,您需要使用原始數組值索引來執行「$ in」查詢。 –
@GatesVP對不起,我的意思是全部。它看起來像只有一個方向匹配 - 並不是真正的使用索引來比較(排序不敏感)的好方法。您可以使用$ all和$ size獲得非常接近的值,但如果數組中存在重複項,則不會檢查出現次數。 –