【问题标题】:MongoDB $elemMatch $inMongoDB $elemMatch $in
【发布时间】:2013-11-24 02:37:16
【问题描述】:

所以,我有一个数据库,其中包含大量文档中的数组。 我想使用$in查找我的查询与一个或多个数组元素完全匹配的整个文档。

所以,文档结构:

{
  "_id": "76561198045636214",
  "timecreated": 1311148549,
  "unusual": [
    {
      "id": 1960169991,
      "original_id": 698672623,
      "defindex": 313,
      "_particleEffect": 19
    },
    {
      "id": 965349033,
      "original_id": 931933064,
      "defindex": 363,
      "_particleEffect": 6
    }
  ]
}

我有很多这样的文档,我想在一个数组条目中找到一个包含 defindex 313 和 _particleEffect 19 的数组,这意味着我必须使用 $elemMatch

我还希望能够一次搜索许多不同的数组组合,例如一个数组,defindex 为 363,_particleEffect 为 19 或 6,这意味着我必须使用 $in

但是,当我尝试将 $elemMatch 和 $in 放入查询中时,elemMatch 将与它无关,因为它不适用于数组。我做不到。

到目前为止我的尝试:

{unusual:{$all:[{"defindex":{"$in":[361,378]}},{"_particleEffect":{"$in":[30,0]}}]}}

(我最近的尝试,根本行不通。)

{"$and":[{"unusual.defindex":{"$in":[361,378]}},{"unusual._particleEffect":{"$in":[[30,36]]}}]}

还有更多我尝试与$elemmatch$and 组合的地方。

(在异常数组中查找项目但忽略数组分隔 IE 它将返回一个文档,其中将使用多个项目来满足条件(因此至少一个项目的 defindex 匹配,一个项目具有效果。) )

我在这方面花了一天半的时间,并且已经走了很远,甚至发现了一个与我的几乎相同但没有提及$in 部分的问题。 -> MongoDB: Match multiple array elements

tl;dr:有没有办法有效地做到$in + $elemMatch

感谢您阅读并能够阅读我格式有些错误的帖子,谢谢。

【问题讨论】:

    标签: arrays mongodb mongodb-query


    【解决方案1】:

    试试这个(已测试)

    {
    "unusual":  { 
            $all:[{
                $elemMatch:{"defindex":313},
                $elemMatch:{"_particleEffect":6}
            }]
        }
    }
    

    【讨论】:

    • 这可以匹配一个,但我想匹配 defindex 和particleeffect 都是 $in[]
    • 对象中不能有相同的键。
    • 就像@VictorS 所说的那样。只会应用这里的最后一条规则$elemMatch:{"_particleEffect":6}
    • 我认为您只是在括号中滑倒了:如果您将$all 的值更改为[{$elemMatch:{...}},{$elemMatch:{...}}](即,将中间的, 更改为},{),那么这两个条件都将是测试。但仍然不是对原始问题的有用答案。
    【解决方案2】:

    https://jira.mongodb.org/browse/SERVER-3544

    Welp,做了很多挖掘工作,看起来这回答了我的问题。 你现在不能做 $in $elemmatch。

    【讨论】:

    • 我看不出该错误与您的案例有何关联 - 您不必使用 $in 和 $elemMatch 来表达您的错误,您可以通过多种其他方式构建查询。
    【解决方案3】:

    您可以使用与您尝试使用的语法不同的语法,以达到相同的结果,但不会遇到 SERVER-3544 中的限制。

    使用这个语法:

    db.collection.find({ "unusual": {"$elemMatch":{"defindex":363,"_particleEffect":{"$in":[6,19]}  }} })
    

    这将匹配具有 313 和 6 或 19 的数组元素的任何文档。

    它也适用于 defindex 和 _particleEffect 的{$in:[]},只要您打算匹配这两个列表的任意组合。

    db.collection.find({ "unusual": {"$elemMatch":{"defindex":{"$in":[313,363]},"_particleEffect":{"$in":[6,19]}  }} })
    

    【讨论】:

      猜你喜欢
      • 2018-08-18
      • 1970-01-01
      • 2014-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      相关资源
      最近更新 更多