假設我們有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查詢來實現這一點?
假設我們有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查詢來實現這一點?
如果你想從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
注意:您可以對其進行優化來獲得獨特的效果。
你可以用一個相對簡單的mongo查詢來實現這個 –
是的,我看到了......但是如果你在給定的數組中添加一個或兩個以上的元素,它會變得更加複雜,不是嗎?無論如何,我認爲我的答案只是更通用,但它是downvoting沒有錯。 – Schaliasos
是的,數據模式應該更好我猜:( –
聽起來好像可能有更好的方法來實現你想要做的事情,但沒有更多的信息,很難提出高層次的建議。
下面是一個查詢,將讓你在尋找什麼:
{
$or:
[
{
tags:
{
$all: ['1', '3']
}
},
{
tags:
{
$all: ['3', '5']
}
},
{
tags:
{
$all: ['1', '5']
}
}
]
}
你會發現,它涉及到上市對您正在搜索標籤的每個組合,因此它贏得了」噸擴展到更大的查詢。
編輯:通過使用$all
而不是$and
來簡化查詢。
其實我想過這個,但不幸的是,列表的長度是多達25,我想匹配至少20%。 – ldsenow
@ldsenow這將是一件好事在你的問題中指出,也許如果你從更高的層次上了解你正在嘗試的是什麼,那麼有人可以提供幫助,因爲這是在Mongo查詢中完成的最好方法。 –
有些要求不能在查詢中實現。如果這是你的應用程序的一部分,我建議在其中添加功能,而不是試圖爲此創建查詢。也許你可以在shell上用javascript實現它,但這也是編程。 – Schaliasos
可能的重複[如何檢查數組字段是否是MongoDB中另一個數組的一部分?](http://stackoverflow.com/questions/15635658/how-to-check-if-an-array-field-is -a-part-of-another-array-in-mongodb) – WiredPrairie
@WiredPrairie它是相似的,但真的是我想要的。無論如何感謝 – ldsenow