我刚开始使用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的子类型的首选项,如何为此编写查询?
来自@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;
您应该将$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 ######。 换行符 不要使用 -- 或者 ---这样