在 Mongo 个嵌入文档中选择性查找
Selective find within a Mongo embedded document
我正在尝试查找包含与搜索关键字匹配的元素的文档。在下面的示例中,我有 6 个文档,其中包含主要类别和次要类别。
文档格式为:
{
docID: <some proxy ID>,
classCategories: {
[
"<major classification>" : [ "<array of sub classifications>" ]
]
}
}
我有以下 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, "classCategories": {"1": [1], "2": [2, 6]}})
db.test.insert_one({"docID": 4, "classCategories": {"1": [1], "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, 3], '2': [2, 4]}
3 -> {'1': [1], '2': [2, 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。
我应该如何查询这个,and/or我应该考虑不同的文档结构吗?
我已经通过几个途径解决了这个问题:
- 文档格式需要略有不同。 classCategories,需要是 sub-documents 的数组,而不是数组的文档。
- 搜索将使用 $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, "classCategories": [{"1": [1], "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, 3]}, {'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]}]
2 -> [{'1': [1, 3]}, {'2': [2, 4]}]
3 -> [{'1': [1], '2': [2, 6]}]
4 -> [{'1': [1], '2': [2]}]
6 -> [{'2': [2]}]
Restricted Data-2
2 -> [{'1': [1, 3]}, {'2': [2, 4]}]
我正在尝试查找包含与搜索关键字匹配的元素的文档。在下面的示例中,我有 6 个文档,其中包含主要类别和次要类别。
文档格式为:
{
docID: <some proxy ID>,
classCategories: {
[
"<major classification>" : [ "<array of sub classifications>" ]
]
}
}
我有以下 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, "classCategories": {"1": [1], "2": [2, 6]}})
db.test.insert_one({"docID": 4, "classCategories": {"1": [1], "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, 3], '2': [2, 4]}
3 -> {'1': [1], '2': [2, 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。
我应该如何查询这个,and/or我应该考虑不同的文档结构吗?
我已经通过几个途径解决了这个问题:
- 文档格式需要略有不同。 classCategories,需要是 sub-documents 的数组,而不是数组的文档。
- 搜索将使用 $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, "classCategories": [{"1": [1], "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, 3]}, {'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]}]
2 -> [{'1': [1, 3]}, {'2': [2, 4]}]
3 -> [{'1': [1], '2': [2, 6]}]
4 -> [{'1': [1], '2': [2]}]
6 -> [{'2': [2]}]
Restricted Data-2
2 -> [{'1': [1, 3]}, {'2': [2, 4]}]