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

如何编写更新嵌入式文档的查询

常智勇
2023-03-14

我刚开始使用Spring data mongob,但我只是被卡住了,如何使用mongo存储库编写基于json的嵌入式文档查询。

我的数据库看起来像

"_id" : ObjectId("5565ad670cf25cbd975ab2d9"),
    "_class" : "com.samepinch.domain.metadata.Metadata",
    "preferenceType" : "shopping",
    "subtypes" : [
        {
            "_id" : ObjectId("5565ad670cf25cbd975ab2d2"),
            "subType" : "veg",
            "preferencePoint" : 0
        },
        {
            "_id" : null,
            "subType" : "nonveg",
            "preferencePoint" : 0
        }
    ],
    "createdDate" : ISODate("2015-05-27T11:41:27.357Z"),
    "updatedDate" : ISODate("2015-05-27T11:41:27.357Z")

我想更新基于顶级文档id的子类型,我必须更新具有id 5565ad670cf25cbd975ab2d2的子类型的首选项,如何为此编写查询?

共有2个答案

姜玮
2023-03-14

来自@Query java doc org。springframework。数据mongodb。存储库。查询

注释直接在存储库方法上声明查找器查询。这两个属性都允许使用占位符符号?0, ?1等等。

以下是可以传递给注释的所有属性(如下所示)

从定义来看,您似乎只能读取、筛选特定字段、执行count()或删除与查询匹配的域对象。我没有看到任何关于更新的信息。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
@QueryAnnotation
public @interface Query {

    /**
     * Takes a MongoDB JSON string to define the actual query to be executed. This one will take precendece over the
     * method name then.
     * 
     * @return
     */
    String value() default "";

    /**
     * Defines the fields that should be returned for the given query. Note that only these fields will make it into the
     * domain object returned.
     * 
     * @return
     */
    String fields() default "";

    /**
     * Returns whether the query defined should be executed as count projection.
     * 
     * @since 1.3
     * @return
     */
    boolean count() default false;

    /**
     * Returns whether the query should delete matching documents.
     * 
     * @since 1.5
     * @return
     */
    boolean delete() default false;
牛枫
2023-03-14

您应该将$projection与$elemMatch查询一起使用,如下所示:

db.collectionName.update({"_id" : ObjectId("5565ad670cf25cbd975ab2d9"),
"subtypes":{"$elemMatch":{"_id":ObjectId("5565ad670cf25cbd975ab2d2")}}},
{"$set":{"subtypes.$.preferencePoint":1}})

及其等效的java代码为:

BasicDBObject eleMatch = new BasicDBObject();
eleMatch.put("_id", new ObjectId("5565ad670cf25cbd975ab2d2"));
BasicDBObject elemMatchQuery = new BasicDBObject();
elemMatchQuery.put("$elemMatch", eleMatch);
BasicDBObject query = new BasicDBObject();
query.put("_id", new ObjectId("5565ad670cf25cbd975ab2d9"));
query.put("subtypes", elemMatchQuery);
BasicDBObject set = new BasicDBObject();
set.put("subtypes.$.preferencePoint", 1);
BasicDBObject update = new BasicDBObject();
update.put("$set", set);
DBCollection dbcoll = mongoTemplate.getCollection("collectionName");
DBObject object = dbcoll.update(query, update);
 类似资料:
  • 问题内容: 我浏览了猫鼬API,以及关于SO和google小组的许多问题,但仍然无法弄清更新嵌入式文档。 我正在尝试使用args的内容更新此特定的userListings对象。 以下是架构: 此发现也不起作用,这可能是第一个问题: 返回: 那应该等同于此mongo客户呼叫: 运行: 问题答案: 当您已有用户时,您可以执行以下操作: 如在这里找到:http : //mongoosejs.com/do

  • 本文向大家介绍MongoDB查询中如何更新嵌套文档,包括了MongoDB查询中如何更新嵌套文档的使用技巧和注意事项,需要的朋友参考一下 要更新嵌套文档,请使用update(),并在其中使用点号。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是更新嵌套文档的查询- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出-

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

  • 我在mongoDB中有一个相当复杂的数据结构。文件看起来有点像这样 我想在嵌入式文档的exGroup数组中添加一个文档数组,这样每个嵌入式文档看起来都像这样 我试着用如下的更新查询来实现这一点: 不幸的是,这给了我错误“fundId”:0,“date”:ISODate(“2016-11-21T11:00:00.000 0000”),“basket.assetId”:2500,“basket.exG

  • null 这些操作似乎效率不高。但是这种类型的更新是无处不在的,我相信开发者已经考虑到了这一点。那么,我哪里搞错了?

  • ##用于写一个 h2 头。每个文档必须以 h2 开头。 这是为了支持 appium.io 文档生成。不要使用---下划线方法创建标题。 不要对标题使用 h1 # 或 ===,因为目录表不支持这样(文件夹名称将用作 h1)。 副标题 ### 用于编写副标题 常规标题 #### 用于不出现在目录里的标题。 不要使用 h5 ##### 或是 h6 ######。 换行符 不要使用 -- 或者 ---这样