我是mongodb /
的新手我需要使用mongo shell获取一个文件,如果它的第一个emdedded文档与条件A相匹配,则会将编码B复制。
例如,我只收集了一个文档:
{
"_id": "life",
"docs": [{
"_id": "sex",
"p": 2,
"c": 2
}, {
"_id": "drugs",
"p": 1,
"c ": 2
}, {
"_id": "rock'n'roll",
"p": 1,
"c": 4
}]
}
如果条件是p = 1,那么
----如果B条件是с= 2,我得到“生命”(嵌入式文档“药物”符合条件)
----如果B条件是c = 4,我得到空结果。
如果条件是c = 2,那么
----如果B条件是p = 2,我得到“生命”(emdedded doc“sex”符合条件)
----如果B条件是p = 1,我得到空结果(
TNX
加了:
任务是根据以特定方式应用于emdedded文档的条件来过滤集合并获取整个文档,因此我认为这个问题并不重复。
但在that question的帮助下,我得到了解决方案:
db.test.aggregation([
{
$project:
{
docs:
{
$filter:
{
input:"$docs",
as:"doc",
cond:{$eq:['$$doc.p',1]}
}
}
}
},
{
$project:
{
docs:{$slice:["$docs",1]}
}
},
{
$project:
{
docs:
{
$filter:
{
input:"$docs",
as:"doc",
cond:{$eq:['$$doc.c',2]}
}
}
}
},
{
$project:
{
"docs":1,
"n":{"$size":"$docs"}
}
},
{
$match:{"n":{$gt:0}}
}])
另一种解决方案:
db.c.aggregate([
{
$project:
{
docs:
{
$filter:
{
input:"$docs",
as:"doc",
cond:{$eq:['$$doc.p',1]}
}
}
},
},
{
"$unwind":"$docs"
},
{
"$group":
{
"_id": "$_id",
"doc": { "$first": "$docs" }
}
},
{
$match:{"doc.c":2}
}])
答案 0 :(得分:0)
所以你的意思是你想从数组中提取值并将它呈现在“平面”结构中?
如果这是你的意思,你需要这样的东西:
db.collectionName.aggregate([
{
$match: {
"docs.p": 1,
"docs.c": 2
}
},
{ $unwind: "$docs"},
{
$match: {
"docs.p": 1,
"docs.c": 2
}
}
])
基本上我会$match
两次。在第一个中,您匹配包含这些值的所有文档。然后你$unwind
“扁平”你的阵列结构。最后一步,我再次使用$match
来获取您实际需要的集合。