如何检查数组字段是不是包含唯一值或 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 中的另一个数组?的主要内容,如果未能解决你的问题,请参考以下文章