【问题标题】:Search MongoDB Array of Objects in any order以任意顺序搜索 MongoDB 对象数组
【发布时间】:2020-02-10 20:23:03
【问题描述】:

我有一个带有对象数组的 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: [&lt;3_objects_above&gt;]} 类似,但它不会给我一个完全匹配的结果。例如,如果此集合中有第二个文档为 field2: [...{"index": "Z", "value": "543"}],并且它仅包含上面 2 个查询和表中显示的 3 个对象中的 1 个,则该第二个文档也将被返回,因为它至少匹配提供的 1 个对象即使我没有提供对象{"index": "Z", "value": "543"},也在数组中。

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

【问题讨论】:

  • 不,因为我不知道那个,但我刚刚测试过并且有效!!!谢谢!能否请您回复帖子,以便我接受您的回答?

标签: arrays mongodb object mongodb-query


【解决方案1】:

您可以使用$all 运算符:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 2016-05-15
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多