您可以使用$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" ] }
如果您在數組字段中添加索引,這些查詢將會更快。
$ in操作符在這裏使用會好很多,事實上$或操作符對於這個查詢來說是相當不合適的 – Sammaye
假設有一個索引,我認爲它真的取決於數據以及有多少命中/未命中獲取查詢。如果我對兩種查詢模式都做了解釋,那麼使用$ in查詢時,nscanned可以更高。您是否有任何示例顯示$或者是不好的選項? – brianz
Nah,$或者與它在SQL中的方式不同。這就像爲每個子句發送單獨的查詢(因此每個子句使用單獨的索引),然後在返回時合併重複項。 $或實際上是相當長的過程。 $ in將顯示更多掃描,因爲您可能只查看$或 – Sammaye