如何检查数组字段是否是MongoDB中另一个数组的一部分?

问题描述:

在这个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

您可以使用聚合框架来执行此操作。鉴于以下数据

> 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