Mongodb 如何在mongo中匹配同一文档中的字段值?
我有以下文件:Mongodb 如何在mongo中匹配同一文档中的字段值?,mongodb,Mongodb,我有以下文件: { "_id" : "bfc523ad-c09d-4be8-99c2-64a709cf95ab", "field1" : { "c1" : "bfc523ad-c09d-4be8-99c2-64a709cf95ab", "c2" : "pl_PowerList_bfc523adc09d4be899c264a709cf95ab", }, "Columns" : [ { "nam
{
"_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(在任何一列中)的所有文档。我尝试了以下查询:
db.mycollection.find({$where:"this.field1.c1 == this.Columns.lookup.id"})
当我执行上面的查询时,我得到一个错误,说字段id未定义。我想要所有这样的文档,其中至少有一列的lookup.id与该文档的field1.c1相同。我该怎么做 您可以尝试以下方法:
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;
}
})
使用聚合框架,您可以利用管道操作符。这允许您递归地遍历文档结构,并基于对每个级别的指定条件的评估执行一些操作 与使用操作符相比,使用聚合框架可以大大提高性能 这个概念可能有点难理解,但基本上运算符允许您使用运算符处理逻辑条件,并使用特殊操作来“保留”逻辑条件为真的文档或来“删除”条件为假的文档 此操作类似于有一个管道,该管道选择集合中的字段并创建一个新字段,该字段保存逻辑条件查询的结果,然后创建一个后续的,除了使用单个管道阶段,该阶段根据查看数据所需的访问权限限制结果集的内容,并且效率更高
要在
field1.c1
值等于列的所有文档上运行查询。lookup.id
(在任何列中),请包括阶段,如下所示:
db.mycollection.aggregate([
{
"$redact": {
"$cond": [
{
"$setIsSubset": [
["$field1.c1"],
{
"$map": {
"input": "$Columns",
"as": "col",
"in": "$$col.lookup.id"
}
}
]
},
"$$KEEP",
"$$PRUNE"
]
}
}
])