在Mongo嵌入式文档中的选择性查找

问题描述

我正在尝试查找包含与搜索键匹配的元素的文档。在下面的示例中,我有6个具有主要和次要类别的文档。

文档格式为:

{
    docID: <some proxy ID>,classCategories: {
        [
           "<major classification>" : [ "<array of sub classifications>" ]
        ]
    }
} 

我下面有2个查询:

  1. 查找主要分类为“ 2”的所有文档,其中包括子分类为“ 2”。
  2. 查找主要分类为“ 1”且包括子分类“ 3”的所有文档。

测试代码在这里:

db.test.delete_many({})
db.test.insert_one({"docID": 1,"classCategories": {"1": [1],"2": [2]}})
db.test.insert_one({"docID": 2,"classCategories": {"1": [1,3],"2": [2,4]}})
db.test.insert_one({"docID": 3,6]}})
db.test.insert_one({"docID": 4,"2": [2]}})
db.test.insert_one({"docID": 5,"classCategories": {"1": [1]}})
db.test.insert_one({"docID": 6,"classCategories": {"2": [2]}})

results=db.test.find()
print("All Data")
for r in results:
    print("{} -> {}".format(r["docID"],r["classCategories"]))

print("Restricted Data-1")
results=db.test.find({"classCategories": {"2" : [2]}})
for r in results:
    print("{} -> {}".format(r["docID"],r["classCategories"]))
print("Restricted Data-2")
results=db.test.find({"classCategories": {"1" : [3]}})
for r in results:
    print("{} -> {}".format(r["docID"],r["classCategories"]))

结果在这里:

All Data
1 -> {'1': [1],'2': [2]}
2 -> {'1': [1,'2': [2,4]}
3 -> {'1': [1],6]}
4 -> {'1': [1],'2': [2]}
5 -> {'1': [1]}
6 -> {'2': [2]}
Restricted Data-1
6 -> {'2': [2]}
Restricted Data-2

我希望从第一个查询中看到的是文档1-4和6。它们的主要分类为“ 2”,所有数组的子分类都为2。

在第二个查询中,我希望文档号为2,因为它的主要分类为“ 1”,而子分类数组包含3。

我应该如何查询,和/或应该考虑使用其他文档结构?

解决方法

我已经通过几种途径解决了这个问题:

  1. 文档格式需要稍有不同。 classCategories,必须是子文档的数组,而不是数组的文档。
  2. 搜索将使用$ elemMatch。

这是解决方案:

db.test.delete_many({})
db.test.insert_one({"docID": 1,"classCategories": [{"1": [1]},{"2": [2]}]})
db.test.insert_one({"docID": 2,"classCategories": [{"1": [1,3]},{"2": [2,4]}]})
db.test.insert_one({"docID": 3,"classCategories": [{"1": [1],"2": [2,6]}]})
db.test.insert_one({"docID": 4,"2": [2]}]})
db.test.insert_one({"docID": 5,"classCategories": [{"1": [1]}]})
db.test.insert_one({"docID": 6,"classCategories": [{"2": [2]}]})

results=db.test.find() print("All Data") for r in results:
    print("{} -> {}".format(r["docID"],r["classCategories"]))

print("Restricted Data-1") results=db.test.find({"classCategories": { "$elemMatch": {"2" : 2} } }) for r in results:
    print("{} -> {}".format(r["docID"],r["classCategories"]))

print("Restricted Data-2") results=db.test.find({"classCategories": { "$elemMatch": {"1" : 3} } }) for r in results:
        print("{} -> {}".format(r["docID"],r["classCategories"]))

预期输出为:

All Data
1 -> [{'1': [1]},{'2': [2]}]
2 -> [{'1': [1,{'2': [2,4]}]
3 -> [{'1': [1],'2': [2,6]}]
4 -> [{'1': [1],'2': [2]}]
5 -> [{'1': [1]}]
6 -> [{'2': [2]}]
Restricted Data-1
1 -> [{'1': [1]},'2': [2]}]
6 -> [{'2': [2]}]
Restricted Data-2
2 -> [{'1': [1,4]}]

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...