MongoDB的$elemMatch $in

22

所以,我有一个数据库,其中包含许多文档中的数组。

我想要找到整个文档,其中我的查询与一个或多个数组元素完全匹配,使用$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的组合,可以找到不寻常数组中的项目但忽略数组分隔符,即返回至少有一个匹配defindex和一个具有效果的项目满足条件的文档(因此将使用多个项目来满足条件)。

我花了一天半的时间,已经取得了很大进展,甚至找到了一个几乎与我的问题相同但缺少任何$in部分提及的问题。-> MongoDB:Match multiple array elements

tl;dr: 是否有一种有效的方法来进行$in + $elemMatch

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

3个回答

32
你可以使用不同的语法来实现相同的结果,但不会遇到 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]}  }} })

1

我不明白那个 bug 和你的情况有什么关系 - 你不必使用 $in 和 $elemMatch 来表达你的查询,你可以用多种其他方式来构建查询。 - Asya Kamsky

-1

试一下这个(已测试)

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

这将匹配一个,但我想匹配defindex和particleeffect都是$in[]的情况。 - Digits
1
一个对象中不能有相同的键。 - Victor S
就像@VictorS所说的那样。只有最后一个规则$elemMatch:{"_particleEffect":6}将被应用。 - s.meijer
我认为你在括号方面出了一些问题:如果你将$all的值更改为[{$elemMatch:{...}},{ $elemMatch:{...}}](即将中间的,改为},{),那么两个条件都会被测试。虽然这仍然不是对原始问题的有用回答。 - Arthur Tacca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接