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

Mongo查询不适用于嵌入式文档

逑何平
2023-03-14
db.getCollection('employee').find({"departments.status" : "A"})
{
    "firstName" : "Sichita",
    "lastName" : "Vinchurkar",
    "email" : "svinchurkar@gmail.com",
    "departments" : [ 
        {
            "deptName" : "IT Support",
            .......
            .......
            "status" : "A"
        }, 
        {
            "deptName" : "Mobile Development",
            .......
            .......
            "status" : "I"
        }, 
        {
            "deptName" : "Advisory Dept",
            .......
            .......
            "status" : "A"
        },
        .........
        ..........
        .........
}

共有1个答案

白志勇
2023-03-14

解决方案是使用MongoDB Spring Data(v2.2.6)MongoTemplateAPI的聚合。使用find查询(因此使用聚合的$filter数组运算符)无法检索基于条件的特定数组元素。

MongoOperations mongoOps = new MongoTemplate(MongoClients.create(), "test");
Aggregation agg = newAggregation(
    match(Criteria.where("departments.status").is("A")),
    project()
        .and(filter("departments")
                .as("dept")
                .by(Eq.valueOf("dept.status").equalToValue("A")))
    .as("departments")
);

AggregationResults<Document> results = mongoOps.aggregate(agg, "collection", Document.class);
results.forEach(doc -> System.out.println(doc.toJson()));


[编辑与添加]

包括代码中使用的类和接口的import语句:

import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;

import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.match;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.project;
import static org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.filter;
import static org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Eq;
 类似资料:
  • 我用Mongoose定义了以下模式: 我尝试执行以下查询: 查询不响应,并且从不进入回调函数。这很奇怪,因为这种类型的查询(搜索两个字符串字段)适用于我定义的另一个模式,但不适用于这个模式。另一种模式更简单,不需要任何嵌入文档。 [更新] 我试过你的建议,但不行。我认为只有两个选择: 1.我发布的模式有问题。 多谢!

  • 列名称的类型为int[] 上述查询适用于postgresql,但不适用于hsqldb,甚至适用于sql 尝试的hsqldb版本:2.2.9和2.3.0 在hsqldb中工作的sql是从table_name中选择x,unnest(column_name)y(x)x和y不是该表的列。

  • 问题内容: 有人告诉我: 垂直对齐仅适用于内联,内联块,图像和表格元素。 与text-align不同,它必须应用于子元素,而不是应用于父元素。 但是,当我尝试在内联块元素上设置垂直对齐中间时,它不起作用。为什么? 问题答案: 这是行不通的,因为它vertical- align设置了行内内容相对于其行框而不是其包含块的对齐方式: 此属性影响由inline-level元素生成的框的线框内的垂直位置。

  • 我使用jaxb 3.0.0(xjc.sh)来创建Java类,但出于某种原因,它不尊重嵌入式绑定。jaxb 2.3.1也可以正常工作 $pwd/c/jaxb-ri-3.0.0/jaxb-ri/bin xjc.shValidation.xsd 它正在创建ApiValidator。java,我希望它不会创建一个新的绑定,而不是引用我作为嵌入绑定的绑定。 a/model/ApiValidator。java

  • 问题内容: 此查询出了什么问题: 它在没有该子句的情况下起作用。我似乎忘记了我的SQL。 问题答案: MySQL INSERT语法不支持WHERE子句,因此您的查询将失败。假设您的列是唯一键或主键: 如果您要插入ID为1的新行,则应使用: 如果您尝试更改ID为1的现有行的weight / desiredWeight值,则应使用: 如果需要,还可以使用INSERT .. ON DUPLICATE K

  • 问题内容: 您好,我想按查询排除某些字段。我正在使用nodejs 但在结果集中,我一直在获取密码字段。 问题答案: 投影不适用于新的nodejs mongodb驱动程序…相反,您将不得不在 此处使用游标方法