当前位置: 首页 > 知识库问答 >
问题:

Mongodb对数组字段的查找匹配查询不起作用

东门翰
2023-03-14

我和同事们有如下计划

{
    "_id" : ObjectId("590d46d685a155f33a4a1f1d"),
    "domainName" : "gmail.com",
    "userlevels" : [ 
        {
            "labId" : 104,
            "userlevel" : true
        }, 
        {
            "labId" : 401,
            "userlevel" : false
        }, 
        {
            "labId" : 202,
            "userlevel" : true
        }, 
        {
            "labId" : 102,
            "userlevel" : true
        }, 
        {
            "labId" : 108,
            "userlevel" : true
        }, 
        {
            "labId" : 110,
            "userlevel" : true
        }, 
        {
            "labId" : 120,
            "userlevel" : true
        }, 
        {
            "labId" : 820,
            "userlevel" : false
        }
    ],
    "labconfigs" : [ 
        ObjectId("590d46d685a155f33a4a1f0c"), 
        ObjectId("590d46d685a155f33a4a1f11"), 
        ObjectId("590d46d685a155f33a4a1f10"), 
        ObjectId("590d46d685a155f33a4a1f0d"), 
        ObjectId("590d46d685a155f33a4a1f12"), 
        ObjectId("590d46d685a155f33a4a1f0f"), 
        ObjectId("590d46d685a155f33a4a1f0e"), 
        ObjectId("591087b0b18c5f472905343a")
    ]
}

所以我们想要的是所有在特定labID范围内匹配的文档,结果输出中只有在数组(“userlevels”)中匹配的字段。

比方说,如果我们想要集合中所有匹配的文档,范围在$gt 100到LT 200之间,那么应该有以下所需的输出。

{
    "_id" : ObjectId("590d46d685a155f33a4a1f1d"),
    "domainName" : "gmail.com",
    "userlevels" : [ 
        {
            "labId" : 104,
            "userlevel" : true
        },
        {
            "labId" : 102,
            "userlevel" : true
        }, 
        {
            "labId" : 108,
            "userlevel" : true
        }, 
        {
            "labId" : 110,
            "userlevel" : true
        }, 
        {
            "labId" : 120,
            "userlevel" : true
        }
    ]
}

我试过的

            db.collection('domains').find({
                                           "userlevels":{ $all :[
                                               { "$elemMatch" : { "labId" :{$gte : 100, $lt:200 }}}
                                               ]}
                                          }).toArray(function(err, items) {
              console.log("items",items);
                                 });

它会回复与lab_id(100到200)范围内的文档匹配的所有文档,但会在用户级别回复lab_id。

共有3个答案

刘承运
2023-03-14

对于Mongodb 3.0版

    db.collection('domains').aggregate({
            $match: {
                "userlevels.labId": {
                    $gt: 100,
                    $lt: 200
                }
            }
        }, {
            $project: {
                domainName: 1,
                userlevels: {
                    "$setDifference": [{
                        $map: {
                        input: "$userlevels",
                        as: "result",
                        in: {
                            $cond: [{
                                $and: [{
                                    $gt: ["$$result.labId", 100]
                                }, {
                                    $lt: ["$$result.labId", 200]
                                }, {
                                    $eq: ["$$result.userlevel", true]
                                }]
                            },
                                "$$result",
                                false
                            ]
                        }
                    }},
                   [false]
                  ]
                }
            }
        }

     })
堵昊焱
2023-03-14

在这里你去:

db.domains.aggregate([
    { $unwind : '$userlevels'},
    { $match : { 'userlevels.labId' : { $gt: 100, $lt: 200 } }},
    { $group : {
        '_id' : '$_id',
        'domainName': { '$first' : '$domainName'},
        "userlevels": { "$push": "$userlevels" }
    }}
]);
巫马化
2023-03-14

您必须使用聚合管道。

Initial$match将至少有一个userlevels数组元素的文档限制为匹配labId条件,然后是$filtercond将数组中的元素限制为每个匹配文档中的匹配labId条件。

$project以包括(1)domainName并用过滤值覆盖userlevels

aggregate({
    $match: {
        "userlevels.labId": {
            $gt: 100,
            $lt: 200
        }
    }
}, {
    $project: {
        domainName: 1,
        userlevels: {
            $filter: {
                input: "$userlevels",
                as: "result",
                cond: {
                    $and: [{
                        $gt: ["$$result.labId", 100]
                    }, {
                        $lt: ["$$result.labId", 200]
                    }]
                }
            }
        }
    }
})
 类似资料:
  • 所以我对大约500k文档有以下查询,它在数据库端非常慢: 我知道allowDiskUse使它变慢,但如果禁用它,我会得到: MongoError:超过$group的内存限制,但不允许外部排序。通过允许磁盘使用:真来选择加入。

  • 本文向大家介绍MongoDB查询以查找FirstName和LastName的字段组合?,包括了MongoDB查询以查找FirstName和LastName的字段组合?的使用技巧和注意事项,需要的朋友参考一下 以下是要查询的字段组合查询- 这将产生以下输出-

  • 来自< code>$elementMatch的MongoDB文档: $elemMatch运算符将包含数组字段的文档与至少一个与所有指定查询条件匹配的元素匹配。 但是,如何将包含数组字段的文档与与查询匹配的所有元素进行匹配? 例如,我有这样的文档: 我需要匹配所有具有所有 如果我使用以下查询: 该文档将被匹配,因为至少有一个价格 我也试过这个,但它似乎不工作: 有没有办法排除查看所有价格而不是至少一

  • 我有一个字符串列表,上面有一周中几天的日期。 我的目标是能够找到属于某个星期的几个文档。比较字段为“第一天”。 遵循数据库中文档结构的图像: 但是搜索没有找到任何文件。预计查询数量将为35。 我想知道是否有任何方法可以通过给定的文档字段找到文档,匹配arraylist中的任何项。

  • 我有一个字符串数组,我想查找具有字段且值包含在数组中的所有文档。 例如,假设我有数组< code>kidsInTrouble = ["Jerry "," Tom "," Arnold"], 我想搜索我的学生集合,以找到< code>name字段为< code>"Jerry" 、< code>"Tom"或< code>"Arnold"的所有孩子。 (如果可以使用Spring的Mongo驱动程序方法提

  • 问题内容: 我的目标是搜索单词,而不考虑添加到其中的分析器。 我将 匹配 查询与 关键字分析器一起使用, 但我认为它可以与添加到该属性的默认分析器一起使用。 在elasticsearch中,我的作者文档结构像 索引映射: 在这里,我注意到我的标题分析器过滤器之一是 ngram 但是我在匹配查询中使用了 关键字分析器 ,以避免搜索过程中自动完成。 但是当我搜索时,上面的文件是匹配的。我期望的是组织具