【问题标题】:Mongo Db $in query with multiple keysMongodb $in 多键查询
【发布时间】:2017-04-07 13:41:01
【问题描述】:

我有一个 Mongo db 文档集合,其中包含 _idversion 和许多其他字段。我有一组 id 之类的:

["1A", "2b", "3C", "4D"]

如果我想要所有包含上述任何 id 的文档,我可以像这样查询:

{
  _id : {
         $in: ["1A", "2b", "3C", "4D"]
        }
}

我想知道我们是否可以使用 _id 之外的其他条件进行查询,即上述带有条件的数组,如下所示:

{
      $in: [{"id":"1A","version":"1.1"},{"id":"2B","version":"2.1"},{"id":"3C","version":"3.1"},{"id":"4D","version":"4.1"}]
        }
}

{"id":"1A","version":"1.1"} 的示例: 我想要所有 id 为 1Aversion 为 1.1 的文档。对于数组中的所有对象也是如此。

【问题讨论】:

  • 您的问题是什么?请用更好的例子重写问题。
  • @Saleem 很抱歉缺少清晰性。我已经编辑了这个问题。希望现在可以理解了。

标签: mongodb


【解决方案1】:

你可以试试这样的:

 db.collection.find(
   {
     //this OR will make sure that you get at any matching combination
     $or:[
       {"<FIELD1>": "<VALUE1.1>", "<FIELD2>": "<VALUE1.2>"},
       {"<FIELD1>": "<VALUE2.1>", "<FIELD2>": "<VALUE2.2>"}
     ]
    }
 )

上述$and的文档可在here获取。

还有其他运算符,例如 $or$nothere

【讨论】:

  • 感谢您的回答。这将分别查找 id 和版本并“和”它们。我的问题是,每个 id 即您的“FIELD1”都有其特定的对应版本,即您的“FIELD2”。
  • 谢谢。这是对所有组合进行单个查询的一种解决方案。我可以遍历我的数组并构建这个查询,但我的问题是是否有可能在没有“AND”每个组合的情况下做到这一点,即在一个查询中包含所有组合。
  • 更新了答案,我 99% 确定你会接受这个。开玩笑。 ;)
【解决方案2】:

显示具有两个值的示例。您可以根据需要添加任意数量。对多键使用 $or 和 $and 运算符。

find({
    "$or": [{
        "$and": [{
            "_id": "1A"
        }, {
            "version": "1.1"
        }]
    },{
        "$and": [{
            "_id": "2B"
        }, {
            "version": "2.1"
        }]
    }]
})

更新以在对象数组中包含搜索。

样本集合:

db.multikeys.insertMany([{
    _id: 1,
    tags: [{
        _id: "1A",
        version: "1.1"
    }, {
        _id: "2B",
        version: "1.4"
    }]
}, {
    _id: 2,
    tags: [{
        _id: "2B",
        version: "2.1"
    }, {
        _id: "3C",
        version: "3.1"
    }]
}])

查询:

db.multikeys.find({
    tags: {
        $elemMatch: {
            $or: [{
                _id: "2B",
                version: "2.1"
            }, {
                _id: "1A",
                version: "1.1"
            }]
        }
    }
}).pretty()

样本输出:

{
    "_id": 1,
    "tags": [{
        "_id": "1A",
        "version": "1.1"
    }, {
        "_id": "2B",
        "version": "1.4"
    }]
} {
    "_id": 2,
    "tags": [{
        "_id": "2B",
        "version": "2.1"
    }, {
        "_id": "3C",
        "version": "3.1"
    }]
}

【讨论】:

  • 当过滤器对一组项目进行时,这将无法正常工作。自己试试看
  • 我知道。但OP没有提到任何关于在数组中搜索的内容。我会等待 OP 确认并相应更改。
  • 这不起作用。我有一个对象数组,就像问题中提到的那样,每个对象都有一个 id 和版本。我想检查每个对象中是否有任何文档同时满足这两个值。仅当该 ID 与相应版本匹配时,我才需要该文档。这和 $in 一样,除了我有两个值要检查而不是一个。
  • 请看一下。根据我的理解更新。希望能帮助到你。您也可以使用 $in 运算符代替 $or 我认为。
【解决方案3】:

您需要使用$elemMatch 来匹配这两个条件,例如

db.collection1.find(
   { arrayObjectKeyName: { $elemMatch: { id: "1A", version: "1.1" } } }
)

当然,这里有一个例子

db.collection1.find({ "arrayObjectKeyName": {"$elemMatch":{"id": "1A","version":{"$in":["1.1","1.3","1.9876"]}  }} })

【讨论】:

  • 感谢您的回复。但要做到这一点,我必须分别查询每个“id”。相反,我希望能够像对 id 数组执行“$in”一样执行单个查询。
  • @suzo,不,您也可以在$elemMatch 中使用$in 运算符
  • 没错,我只是想知道我们如何做到这一点。你能帮我解决这个问题吗?
  • 感谢您的编辑,但它不起作用。请在 Veeram 的回答中查看上述评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多