我的文档结构是,
{
"objects" : {
"obj1": {
"name" : "AC",
"prop1" : "val1",
"prop2" : "val2"
},
"obj2": {
"name" : "BC",
"prop1" : "val1",
"prop2" : "val2"
},
"obj3": {
"name" : "AB",
"prop1" : "val1",
"prop2" : "val2"
}
}
}
我想在regex
内的所有对象的name
字段上执行objects
匹配,并仅返回匹配的子对象。我尝试了以下match
查询,
{
$or: [{
"object.obj1.name": {
$regex: "searchText"
}
}, {
"object.obj2.name": {
$regex: "searchText"
}
}, {
"object.obj3.name": {
$regex: "searchText"
}
}]
}
这场比赛有效。但是我应该在select
字段中给出什么?如果我给{"object.obj1": 1, "object.obj2": 1, "object.obj3": 1}
,则如果任何一个regex
匹配通过,则将返回所有子对象。如何在不使用聚合的情况下有条件地执行select
?是否可以不进行聚合?
谢谢,
答案 0 :(得分:0)
在我得到答案之前,我想指出架构不太正确,如果你想要使用数组嵌套多个文档,这种方法会让你省去很多麻烦,相信我: / p>
{
"objects" : [
{
"name" : "AC",
"prop1" : "val1",
"prop2" : "val2"
},
{
"name" : "BC",
"prop1" : "val1",
"prop2" : "val2"
},
{
"name" : "AB",
"prop1" : "val1",
"prop2" : "val2"
}
]
}
现在,我想您希望过滤掉每个匹配文档的objects
内的一些嵌套文档。遗憾的是,这是一个你应该使用聚合管道的情况。如果您对此不了解,则可以使用投影操作符仅过滤数组中的一个元素:$和$elemMatch,但在这种情况下,您需要返回更多而不是一个。
这里是我认为符合您要求的汇总管道:
aggregation = [
{
// Match documents having at least one nested object with "A" in name
$match: {
"objects.name": {
$regex: "A"
}
}
},
{
$unwind: "$objects"
},
// Match all nested documents containing "A" in name
{
$match: {
"objects.name": {
$regex: "A"
}
}
},
// Groups nested documents to return them as individual documents.
// Here you can add more fields and perform other operations if needed
{
$group: {
"_id": "$objects.name"
}
}
]
db.collection.aggregate(aggregation)
我希望这可以帮助你,我不太清楚你希望查询输出的输出,但无论如何,我可能至少可以给你一个想法!祝你好运!