2013-06-27 80 views
1

在MongoDB中存儲對象的

{ array: ["a", "b", "c", ... ] } 
{ array: ["a", "d", "f", ... ] } 
... 

欲檢索具有例如所有對象的形式"b""d"作爲其array字段中的值。我怎樣才能做到這一點?我試過是

{ $match: { array: { $all: [ "b", "d" ] } } } 

但這需要"b""d"存在於以匹配。

回答

4

您可以使用$or運營商在array領域一個簡單的查詢,或操作中的$作爲Sammaye指出以下(這將是更好的性能):

http://docs.mongodb.org/manual/reference/operator/or/#op._S_or

> db.coll.insert({ array: ["a", "b", "c"] }) 
> db.coll.insert({ array: ["a", "d", "f"] }) 
> 
> db.coll.find({ array : 'b' }) 
{ "_id" : ObjectId("51cc7aa881e227fe57ccb569"), "array" : [ "a", "b", "c" ] } 
> 
> db.coll.find({ array : 'a' }) 
{ "_id" : ObjectId("51cc7aa881e227fe57ccb569"), "array" : [ "a", "b", "c" ] } 
{ "_id" : ObjectId("51cc7ab481e227fe57ccb56a"), "array" : [ "a", "d", "f" ] } 

$在:

> db.coll.find({ array : { $in : ['a', 'b'] } }) 
{ "_id" : ObjectId("51cc7aa881e227fe57ccb569"), "array" : [ "a", "b", "c" ] } 
{ "_id" : ObjectId("51cc7ab481e227fe57ccb56a"), "array" : [ "a", "d", "f" ] } 

> db.coll.find({ array : { $in : ['c', 'z'] } }) 
{ "_id" : ObjectId("51cc7aa881e227fe57ccb569"), "array" : [ "a", "b", "c" ] } 

$或:

> db.coll.find({ $or : [ { array : 'a' }, { array : 'b' } ] }) 
{ "_id" : ObjectId("51cc7aa881e227fe57ccb569"), "array" : [ "a", "b", "c" ] } 
{ "_id" : ObjectId("51cc7ab481e227fe57ccb56a"), "array" : [ "a", "d", "f" ] } 
> 
> db.coll.find({ $or : [ { array : 'c' }, { array : 'z' } ] }) 
{ "_id" : ObjectId("51cc7aa881e227fe57ccb569"), "array" : [ "a", "b", "c" ] } 

如果您在數組字段中添加索引,這些查詢將會更快。

+2

$ in操作符在這裏使用會好很多,事實上$或操作符對於這個查詢來說是相當不合適的 – Sammaye

+0

假設有一個索引,我認爲它真的取決於數據以及有多少命中/未命中獲取查詢。如果我對兩種查詢模式都做了解釋,那麼使用$ in查詢時,nscanned可以更高。您是否有任何示例顯示$或者是不好的選項? – brianz

+3

Nah,$或者與它在SQL中的方式不同。這就像爲每個子句發送單獨的查詢(因此每個子句使用單獨的索引),然後在返回時合併重複項。 $或實際上是相當長的過程。 $ in將顯示更多掃描,因爲您可能只查看$或 – Sammaye