2013-03-26 26 views
1

在這個question,傑夫熊解釋瞭如何搜索文件與數組如何檢查數組字段是否是MongoDB中另一個數組的一部分?

contains 'tag1' 
contains ['tag1','tag2'], 
contains any of ['tag3', 'tag4'] 

但我應該怎麼做,如果我要搜索的文件與數組是另一個陣列的一部分?

post1.tags = ['tag1'] 
post2.tags = ['tag1','tag3'] 
post3.tags = ['tag2','tag4'] 
post4.tags = ['tag1','tag2','tag3','tag4'] 

我想POST1和post3因爲他們有標籤

contained in ['tag1', 'tag2', 'tag4'] 

我不想讓POST2和post4,因爲TAG3不['tag1', 'tag2', 'tag4']

在其他存在單詞,選擇其標籤數組中的所有元素都可以在另一個條件數組中找到的帖子

+0

你說的「另一個陣列的一部分」的意思應該標籤包含所有你想找的或者只是你想要的一些東西? – Sammaye 2013-03-26 11:17:35

+0

{post1.tags = ['tag1']}或{post2.tags = ['tag1','tag3']}是array ['tag1','tag3']的一部分。 – 2013-03-26 11:19:35

+0

假設你可以放棄你可以執行的命令:'db.col.find({tags:[tag1,tag2]})'但它需要一個好的命令 – Sammaye 2013-03-26 11:20:53

回答

3

您可以使用聚合框架來執行此操作。鑑於以下數據

> db.post.find() 
{ "_id" : 1, "tags" : [ "tag1" ] } 
{ "_id" : 2, "tags" : [ "tag1", "tag3" ] } 
{ "_id" : 3, "tags" : [ "tag2", "tag4" ] } 
{ "_id" : 4, "tags" : [ "tag1", "tag2", "tag3", "tag4" ] } 

聚集查詢

db.post.aggregate({ 
    $project: { 
    _id: 1, 
    tags: 1, 
    killFlag: { 
     $const: [true, false] 
    } 
    } 
}, { 
    $unwind: "$tags" 
}, { 
    $unwind: "$killFlag" 
}, { 
    $match: { 
    $nor: [{ 
     tags: { 
      $in: ['tag1', 'tag2', 'tag4'] 
     }, 
     killFlag: true 
     } 
    ] 
    } 
}, { 
    $group: { 
    _id: "$_id", 
    tags: { 
     $addToSet: "$tags" 
    }, 
    killFlag: { 
     $max: "$killFlag" 
    } 
    } 
}, { 
    $match: { 
    killFlag: false 
    } 
}, { 
    $project: { 
    _id: 1, 
    tags: 1 
    } 
}) 

會給你

{ 
    "result": [{ 
     "_id": 3, 
     "tags": [ 
      "tag4", 
      "tag2" 
     ] 
    }, { 
     "_id": 1, 
     "tags": [ 
      "tag1" 
     ] 
    } 
    ], 
    "ok": 1 
} 
+0

它工作得很好,非常感謝。 – 2013-03-31 14:33:23

相關問題