如何检查数组字段是不是包含唯一值或 MongoDB 中的另一个数组?

Posted

技术标签:

【中文标题】如何检查数组字段是不是包含唯一值或 MongoDB 中的另一个数组?【英文标题】:How to check if an array field contains a unique value or another array in MongoDB?如何检查数组字段是否包含唯一值或 MongoDB 中的另一个数组? 【发布时间】:2011-07-19 00:15:12 【问题描述】:

我现在正在使用 mongodb。

我有一个博文集合,它有一个 tags 字段,它是一个数组,例如

blogpost1.tags = ['tag1', 'tag2', 'tag3', 'tag4', 'tag5']
blogpost2.tags = ['tag2', 'tag3']
blogpost3.tags = ['tag2', 'tag3', 'tag4', 'tag5']
blogpost4.tags = ['tag1', 'tag4', 'tag5']

我该如何进行这些搜索

    包含tag1 包含['tag1','tag2'] 包含任何['tag3', 'tag4']

【问题讨论】:

【参考方案1】:

试试这个:

db.blogpost.find( 'tags' : 'tag1'); //1
db.blogpost.find( 'tags' :  $all : [ 'tag1', 'tag2' ] ); //2
db.blogpost.find( 'tags' :  $in : [ 'tag3', 'tag4' ] ); //3

【讨论】:

这在帮助中有很好的记录:mongodb.org/display/DOCS/… 对于 $all 是指所有元素 AND 以表达的顺序还是只是无序? @ScottHernandez 我没有看到他们提到您用作搜索的字段可以是一个数组,以及如何处理它。 “字段: $in:数组”。当您在数组数组中搜索数组时会发生什么?未指定。 我们可以对数组做任何索引来停止重复吗?如果是,请指导如何。 @redben 它的无序就像在文档中写的那样:$all operator DOCS。只需阅读示例部分,您就会明白。【参考方案2】:

我的经验是,对于 (2),以下解决方案比使用 "$all" 的解决方案快得多:

db.blogpost.find( $and: [ tags: 'tag1' ,tags: 'tag2' ] );

但老实说,我不知道为什么。如果有人知道,我会很感兴趣。

【讨论】:

顺便说一下,刚刚在索引关键字列表上进行了测试。 $and 和 $all 的结果完全一样 也许在此期间随着新版本的改变。 这是间接的。对于“$and”,mongodb 进行逻辑“and”操作。因此,如果第一个表达式为假,则不考虑第二个表达式。这意味着更少的处理。 但这也应该发生在 '$all' 上,不是吗!? $all 可能是对索引的两次查找,$and 可能是对结果进行顺序扫描的一次查找。

以上是关于如何检查数组字段是不是包含唯一值或 MongoDB 中的另一个数组?的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb检查数组的子文档中是否存在字段

Mongodb:如何检查一个点是不是包含在多边形中?

Mongodb-查询json数组中的字段是不是存在

MongoDB 字段索引后,如何快速检查一个该字段的数值是不存在的

检查数组是不是包含元素 mongodb

猫鼬中的唯一如果不是空检查