2012-12-28 37 views
0

在JavaScript中,我們可以使用使用OBJECTID如MongoDB中數組

​​3210

的indexOf我想要做同樣的MongoDB中的ObjectID例如在陣列中查找特定字符串的位置

> ids= db.foo1.distinct('_id'); 
[ 
     ObjectId("50d38d775f2b6c6e3393d6b0"), 
     ObjectId("50d38d835f2b6c6e3393d6b1") 
] 
> id0=db.foo1.findOne()._id 
ObjectId("50d38d775f2b6c6e3393d6b0") 

我正在尋找一種方法來做類似於ids.indexOf(id0),這將給我在ids內id0的位置。我可以將所有內容轉換爲字符串,然後使用indexOf,但我希望找到一個更簡單的方法來完成此操作。

回答

1

我不認爲有一個一行,這和你需要使用一個for循環:

for (var i=0; i<ids.length; i++) { 
    if (ids[i].equals(id0)) { ixOfId0 = i; break; } 
} 
+1

我做了類似的事情。我希望有一個更聰明的方法來做到這一點。非常感謝 – user1848018

1

如果列表中不經常改變(或僅添加到)考慮只需添加索引爲{ i: 0, r: ObjectId('....') }的文檔,其中i字段表示索引。

Then db.foo1.find({ 'list.r' : ObjectId('...') })。結果將通過查看結果文檔中的i字段來獲得索引。

但是,如果列表很長,這將始終是一個O(N)操作,因爲它必須遍歷每個數組元素來查找匹配。您可能需要創建一個索引來提高性能。

+0

數據集太大,我不能改變它,但感謝評論 – user1848018

+0

你如何使用「索引」值?似乎MongoDB的數據可能無法高效構建?另外,除非您明確地將它們放入數組中,否則不能保證順序。使用Distinct並不能保證特定的順序(並且'_id'使用'distinct'並不合理,因爲'_id'必須是每個mongodb唯一/不同的)。 – WiredPrairie