【问题标题】: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']

我该如何进行这些搜索

  1. 包含tag1
  2. 包含['tag1','tag2']
  3. 包含任何['tag3', 'tag4']

【问题讨论】:

    标签: mongodb


    【解决方案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 可能是对结果进行顺序扫描的一次查找。
    猜你喜欢
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 2017-05-30
    • 2013-03-16
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多