gpt4 book ai didi

MongoDB:混合 $all 和 $elemMatch

转载 作者:IT老高 更新时间:2023-10-28 12:31:46 26 4
gpt4 key购买 nike

我有一个包含 5 个项目的集合“项目”,每个项目都有一个 id 和一个数组

{ _id: ObjectId("51c21bec162c138d9d0001a7"), 
tags: [ { name: "a", type: "tag" }, { name: "b", type: "tag" }, { name: "c", type: "note" } ]
}
{ _id: ObjectId("51c21ca22c69904840000178"),
tags: [ { name: "a", type: "tag" }, { name: "d", type: "tag" }, { name: "c", type: "note" } ]
}
{ _id: ObjectId("51c21cc1478cf6691a0001b4"),
tags: [ { name: "d", type: "tag" }, { name: "b", type: "tag" }, { name: "c", type: "note" } ]
}
{ _id: ObjectId("51c22292162c13b1ff000222"),
tags: [ { name: "a", type: "tag" }, { name: "d", type: "tag" }, { name: "e", type: "note" } ]
}
{ _id: ObjectId("51c222e926d602a57d0001d8"),
tags: [ { name: "a", type: "tag" }, { name: "d", type: "note" }, { name: "c", type: "note" } ]
}

这里的目标是返回所有具有标签“a”和“d”的项目,其中标签的类型为“tag”。您可能认为这样做会:

find({"tags.name":{"$all":["a","d"]}, "tags.type":'tag'})

返回 3 个文档,这是错误的,但我了解到此查询执行或。所以我尝试使用 '$elemMatch' 来做到这一点,我认为这是最直观的方式,但是

find({"tags":{"$elemMatch":{'name':{'$all':["a","d"]}, "type":'tag'}}})

不返回任何文档。

同样的查询,如果我只想要标记为“a”的项目:

find({"tags":{"$elemMatch":{'name':{'$all':["a"]}, "type":'tag'}}})

大概是因为 $all 被映射到 $eq 之类的东西。

最终我发现以下是我最初的目标需要做的事情:

find({"tags":{"$all":[{'$elemMatch':{'name':"a", "type":'tag'}}, {'$elemMatch':{'name':"d", "type":'tag'}} ]}})

返回正确的两个文档。

但是这种语法太可怕了!我必须自己将数组 ["a", "d"] 扩展到查询中。如果我正在编写一个通用查询引擎,并且我想说嵌入式文档的多个字段都是数组,并且我想要每个数组中的某个值的子集怎么办?

有没有更好的方法来做到这一点?更好的语法?

最佳答案

您最终得出的是正确的解决方案。以编程方式构造 $elemMatch 规则数组可能是一种改进。

考虑以下python:

match_rules = []
for tag in query_tags:
match_rules.append({
'$elemMatch': {
'name': tag
'type': 'tag'
}
})

collection.find({"tags":{"$all": match_rules}})

关于MongoDB:混合 $all 和 $elemMatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17202491/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com