2013-07-01 74 views
3

假設我們有MongoDB的陣列路口

post1.tags = [ '1', '2', '3' ]; 

post2.tags = [ '2', '4', '5' ]; 

post3.tags = [ '1', '3', '4' ]; 

post4.tags = [ '1', '3', '4', '5', '6' ]; 

我試圖找到其包含2個或多個指定標籤的帖子[「1」,「3」,「5」。 結果應該是post1,post3和post4。如何寫一個mongodb查詢來實現這一點?

+0

有些要求不能在查詢中實現。如果這是你的應用程序的一部分,我建議在其中添加功能,而不是試圖爲此創建查詢。也許你可以在shell上用javascript實現它,但這也是編程。 – Schaliasos

+2

可能的重複[如何檢查數組字段是否是MongoDB中另一個數組的一部分?](http://stackoverflow.com/questions/15635658/how-to-check-if-an-array-field-is -a-part-of-another-array-in-mongodb) – WiredPrairie

+0

@WiredPrairie它是相似的,但真的是我想要的。無論如何感謝 – ldsenow

回答

-1

如果你想從shell中做到這一點,你可以使用JavaScript。用下面的代碼創建一個javascropt文件:

use test; 

var initialArray = [1, 2, 3]; 

for (i = 0; i < initialArray.length; i++) { 
    for(j = initialArray.length-1; j>=i; j--) { 
     if(i!=j) { 
      var matchingArray = [initialArray[i].toString(), initialArray[j].toString()]; 
      print("\nResults using array: " + matchingArray); 

      var result = db.posts.find({tags: {$all: matchingArray}}); 

      while(result.hasNext()){ 
       printjson(result.next()); 
      } 
     } 
    } 
} 

,然後運行命令

C:\> mongo < query.js 

注意:您可以對其進行優化來獲得獨特的效果。

+0

你可以用一個相對簡單的mongo查詢來實現這個 –

+0

是的,我看到了......但是如果你在給定的數組中添加一個或兩個以上的元素,它會變得更加複雜,不是嗎?無論如何,我認爲我的答案只是更通用,但它是downvoting沒有錯。 – Schaliasos

+0

是的,數據模式應該更好我猜:( –

2

聽起來好像可能有更好的方法來實現你想要做的事情,但沒有更多的信息,很難提出高層次的建議。

下面是一個查詢,將讓你在尋找什麼:

{ 
    $or: 
    [ 
     { 
     tags: 
      { 
      $all: ['1', '3'] 
      } 
     }, 
     { 
     tags: 
      { 
      $all: ['3', '5'] 
      } 
     }, 
     { 
     tags: 
      { 
      $all: ['1', '5'] 
      } 
     } 
    ] 
} 

你會發現,它涉及到上市對您正在搜索標籤的每個組合,因此它贏得了」噸擴展到更大的查詢。

編輯:通過使用$all而不是$and來簡化查詢。

+0

其實我想過這個,但不幸的是,列表的長度是多達25,我想匹配至少20%。 – ldsenow

+0

@ldsenow這將是一件好事在你的問題中指出,也許如果你從更高的層次上了解你正在嘗試的是什麼,那麼有人可以提供幫助,因爲這是在Mongo查詢中完成的最好方法。 –