我有一份以下文件:
{
"_id" : "bfc523ad-c09d-4be8-99c2-64a709cf95ab",
"field1" : {
"c1" : "bfc523ad-c09d-4be8-99c2-64a709cf95ab",
"c2" : "pl_PowerList_bfc523adc09d4be899c264a709cf95ab",
},
"Columns" : [
{
"name" : "abc49777",
"lookup":{
"id":"bfc523ad-c09d-4be8-99c2-64a709cf95ab"
}
},
{
"name" : "abc7846",
"lookup":{
"id":"cgc523ad-c09d-4be8-99c2-64a709cf95xy"
}
}
]
}
现在我想获取field1.c1值等于Columns.lookup.id(在任何一个colums中)的所有文档。我尝试了以下查询:
db.mycollection.find({$where:"this.field1.c1 == this.Columns.lookup.id"})
当我执行上述查询时,我收到错误消息,指出字段ID未定义。我想要所有这样的文档,其中至少一列具有lookup.id与该文档的field1.c1相同。我该怎么做?
答案 0 :(得分:0)
你可以试试这个:
db.mycollection.find(
{ $where:
function() {
var array = this.Columns;
for (var i in array) {
if(array[i].lookup.id == this.field1.c1) {
return true;
}
}
return false;
}
})
答案 1 :(得分:0)
使用聚合框架,您可以利用 $redact
管道运算符。这允许您以递归方式下降文档结构,并根据每个级别的指定条件的评估执行一些操作。
使用聚合框架的性能大大提高,而不是使用 $where
运算符。
这个概念可能有点棘手,但基本上操作符允许您使用 $cond
运算符处理逻辑条件并使用特殊操作 {{3} “保留”逻辑条件为true的文档或 $$KEEP
以“删除”条件为false的文档。
此操作类似于具有 $$PRUNE
管道,该管道选择集合中的字段并创建一个新字段,其中包含逻辑条件查询的结果,然后是后续的 $project
,但 $match
使用单个管道阶段,该阶段根据查看数据所需的访问权限限制结果集的内容,效率更高
要对field1.c1
值等于Columns.lookup.id
(在任意一个列中)的所有文档运行查询,请包含 $redact
阶段在下面:
db.mycollection.aggregate([
{
"$redact": {
"$cond": [
{
"$setIsSubset": [
["$field1.c1"],
{
"$map": {
"input": "$Columns",
"as": "col",
"in": "$$col.lookup.id"
}
}
]
},
"$$KEEP",
"$$PRUNE"
]
}
}
])