21

因此,我有一个数据库,其中包含大量文档中的数组。我想找到整个文档,其中我的查询与一个或多个数组元素完全匹配,使用$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:匹配多个数组元素

tl;博士:有没有办法有效地做$in+ $elemMatch

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

4

3 回答 3

31

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

使用此语法:

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

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

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

db.collection.find({ "unusual": {"$elemMatch":{"defindex":{"$in":[313,363]},"_particleEffect":{"$in":[6,19]}  }} })
于 2013-12-10T18:25:00.970 回答
1

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

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

于 2013-11-13T02:32:02.893 回答
-1

试试这个(已测试)

{
"unusual":  { 
        $all:[{
            $elemMatch:{"defindex":313},
            $elemMatch:{"_particleEffect":6}
        }]
    }
}
于 2013-11-12T05:34:46.990 回答