首页 > 解决方案 > 以任意顺序搜索 MongoDB 对象数组

问题描述

我有一个带有对象数组的 mongodb 集合。我希望能够以任何顺序搜索数组中的对象,并且仅在找到该数组中的所有对象时才返回匹配项。

我的收藏:

{
    "_id" : ObjectId("5234c367354kj63c9cae4fec"),
    "field1" : "TEST",
    "created" : <DATE_HERE>,
    "field2" : [ 
        {
            "index" : "A",
            "value" : "1"
        }, 
        {
            "index" : "B",
            "value" : "2"
        }, 
        {
            "index" : "C",
            "value" : "3"
        }
    ],
}

如果我提供下面的查询,上面的文档将被返回,因为所有 3 个对象都按照它们存储的确切顺序给出。

db.collection("collection").find({field1: "TEST", field2: [{"index": "A", "value": "1"}, {"index": "B", "value": "2"}, {"index": "C", "value": "3"}]})

但是,我希望能够以任意顺序找到上面给出的 3 个对象的文档。例如下面的查询:

db.collection("collection").find({field1: "TEST", field2: [{"index": "B", "value": "2"}, {"index": "A", "value": "1"}, {"index": "A", "value": "1"}]})

我知道上面的查询不会起作用,如果它甚至可能的话,并且缺少正确的语法/搜索功能,但这只是为了解释我的思考过程和我想要实现的目标。

我试过使用$in类似的搜索field2: {$in: [<3_objects_above>]},但它不会给我一个精确的匹配。例如,如果此集合中有第二个文档,field2: [...{"index": "Z", "value": "543"}]并且它仅包含上面 2 个查询和表中显示的 3 个对象中的 1 个,则该第二个文档也将被返回,因为它与数组中提供的至少 1 个对象匹配即使我没有提供对象{"index": "Z", "value": "543"}

有没有办法以任何顺序在数组中给出对象,并在集合中找到与所有 3 个对象匹配的文档,无论它们以什么顺序给出?匹配所有 3 而不是 3 中的任何一个

标签: arraysmongodbobjectmongodb-query

解决方案


您可以使用$all运算符:

db.collection.find(
   {
      field1: "TEST",
      field2: {
         $all: [
            { "index": "A", "value": "1" },
            { "index": "B", "value": "2" },
            { "index": "C", "value": "3" }
         ]
      }
   }
)   

推荐阅读