- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个包含 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/
根据 mongodb 文档,$elemMatch 的语法是, t.find( { x : { $elemMatch : { a : 1, b : { $gt : 1 } } } } ) 我试过了,效果
我有以下文件 { "_id" : ObjectId("52da43cd6f0a61e8a5059aaf"), "assignments" : [ {
我正在为我的应用中的项目(产品)进行用户评分(赞/不赞)。 我似乎能够通过对象数组实现我想要的,但我想知道 mongodb 是否提供了一种方法来使用数字数组 (user_ids) 实现这一点。 db.
我有以下文件 { "_id" : ObjectId("52da43cd6f0a61e8a5059aaf"), "assignments" : [ {
我正在为我的应用中的项目(产品)进行用户评分(赞/不赞)。 我似乎能够通过对象数组实现我想要的,但我想知道 mongodb 是否提供了一种方法来使用数字数组 (user_ids) 实现这一点。 db.
这是我的对象: { "_id" : ObjectId("53fdcb6796cb9b9aa86f05b9"), "list" : [ "a", "b" ], "complist" : [ { "a"
我正在尝试查找与条件匹配的数组的最后一个元素,例如,如果我有来自 $elemMatch 的数据页: { _id: 1, students: [ { name: "john", scho
我有以下数据结构 { "_id" : ObjectId("523331359245b5a07b903ccc"), "a" : "a", "b" : [ {
我有一个 unitScores 集合,其中每个文档都有一个 id 和一个文档数组,如下所示: "_id": ObjectId("52134edd5b1c2bb503000001"), "scores"
我的 MongoDB 文档结构如下: {_id: ObjectId("53d760721423030c7e14266f"), fruit: 'apple', vitamins: [ {
考虑以下文档: { "_id" : "ID_01", "code" : ["001", "002", "003"], "Others" : "544554" } 我经历了这个MongoDB
所以,我有一个数据库,其中包含大量文档中的数组。我想使用 $in 找到我的查询与一个或多个数组元素完全匹配的整个文档。 所以,文档结构: { "_id": "76561198045636214",
查询运算符$and的用法有什么逻辑区别吗? db.collection.find({$and: [{"array.field1": "someValue"}, {"array.field2": 3}]
我知道您可以使用 $elemMatch 作为投影来限制子集合数组中的项目。当这样使用它时,它会返回匹配的子文档的所有字段,无论是否也指定了 query projections。 是否可以限制匹配子文档
我有一个像这样的集合(摘要)。 { "id":"summaryid", "locations": [ { "id": "loc1",
我有一个包含以下形式文档的集合: { "_id" : { "$oid" : "67bg............"}, "ID" : "xxxxxxxx", "senses"
我有一个像这样的集合(摘要)。 { "id":"summaryid", "locations": [ { "id": "loc1",
假设我有这样一个文档 { title : 'myTitle', favorites : [{name : 'text', number : 6}, {name : 'other', numbe
我的查询: { 'objects.item.opts1.opts2': { '$elemMatch': [ { name: 'false' } ] } } 返回:数组 opts2 中包含任何内容的任何
如何使用 elemMatch 对 SubDocument 数组进行搜索?我有一个名为 ReportCollection 的文档,其中包含以下元素:- /* 0 */ { "_id" : Obj
我是一名优秀的程序员,十分优秀!