MongoDB nested array query

前端 未结 3 1256
抹茶落季
抹茶落季 2020-12-01 01:08

I\'ve asked this as a comment on another question, and also posted a question on mongodb-user. No responses so far, so I\'m resorting to asking a separate question.

3条回答
  •  温柔的废话
    2020-12-01 02:09

    After running some queries, I came to the conclusion that $in doesn't work for an array of arrays.

    You can use $elemMatch instead and it'll work, but it is frustrating that MongoDB's documentation doesn't warn about it.

    I created this document:

    {
          "_id": "51cb12857124a215940cf2d4",
          "level1": [
            [
              "item00",
              "item01"
            ],
            [
              "item10",
              "item11"
            ]
          ],
          "items": [
            "item20",
            "item21"
          ]
    }
    

    Notice that the field "items" is an array of strings and this query works perfectly:

    db.nested.findOne({"items":{"$in":["item20"]} })
    

    Now, "level1.0" is also an array of strings, the only difference is that it's inside another array. This query should work but isn't:

    db.nested.findOne({"level1.0":{"$in":["item00"]} })
    

    The only way to get the result is using $elemMatch:

    db.nested.findOne({"level1":{"$elemMatch":{"$in":['item00']}} })
    

    So $elemMatch solves the problem, but the real solution is to update MongoDB's documentation to states that $in doesn't work for arrays of arrays. Perhaps you should submit a request to 10gen.

提交回复
热议问题