大家好,我正在努力建立一个葡萄酒社交网络。对于我的应用程序,我使用MongoDB和Neo4J。在我的文档数据库中,我存储葡萄酒,对于每个葡萄酒,我都像嵌套文档一样存储所有相关的rewiews。
葡萄酒具有这些特性
相反
葡萄酒评论有这些属性
如果我不改变葡萄酒的值,MongoDB会创建一个文档,所有相关的评论都像嵌套文档一样插入,但是如果我改变葡萄酒的一个属性,比如“省”,MongoDB会创建两个文档,所以两个葡萄酒,即使标题是一样的。情况不对
我的问题是:有没有可能避免这种情况?在一个文档中插入所有标题相同的葡萄酒,即使同一葡萄酒的所有其他属性都发生了变化?(只有当属性相同时才能正常工作)
正确的情况,但这里的葡萄酒属性不会因评论而改变
这是Crud_mongo的代码。爪哇:
public void createWine(String title, String variety, String country, String province, int price, String taster_name, Integer points,
String description, String taster_twitter_handle, String country_user, String e_address, Boolean admin) {
final MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://localhost:27017"));
MongoDatabase database = mongoClient.getDatabase("Wines");
MongoCollection<Document> collection = database.getCollection("wines");
Document wine = new Document("title", "" + title + "")
.append("title", "" + title + "")
.append("variety", "" + variety + "")
.append("country", "" + country + "")
.append("province", "" + province + "")
.append("price", "" + price + "");
Document user = new Document("taster_name", "" + taster_name + "")
.append("score", "" + points + "")
.append("description", "" + description + "")
.append("taster_twitter_handle", "" + taster_twitter_handle + "")
.append("country", "" + country_user + "")
.append("email", "" + e_address + "")
.append("admin", "" + admin + "");
MongoCursor<String> cursormedia = collection.distinct(title, String.class).iterator();
MongoCursor<String> cursor = collection.distinct("_id.title", String.class).iterator();
UpdateOptions options = new UpdateOptions().upsert(true);
Bson filter = Filters.eq(wine);
Bson setUpdate = Updates.push("wine_reviews", user);
collection.updateMany(filter, setUpdate, options);
System.out.println("Successfully inserted review. \n");
}
当前(错误)行为与\u id
的设置一致<代码>\u id必须是唯一的,除了标题
之外,您还有4个其他字段组成这个复杂的关键字,包括省
,因此如果您更改了其他4个字段中的任何一个,将创建一个新文档。
将DB内部键(如\u id
)与业务/数据域键(如title和一些其他属性)分开总是很好的。我建议您让MongoDB驱动程序负责在插入时构造\u id
,并将其他字段移出文档,例如。
{
_id: ObjectId('61e190fc3105a836ad0dc8b1'),
title: "VINO",
variety: "Rosato",
country: "Germania",
province: "a",
price: 50,
reviews: [
{taster_name: "Prova1", score: 50 ...
您现在可以轻松更新:
db.collection.update({_id:ObjectId('61e190fc3105a836ad0dc8b1')},{$set: {province:"b"}});
\u id
是唯一的,因此它只会更新一个文档。如果您选择使用其他条件进行更新,则可能会更新多个文档,也可能不会更新多个文档,但您可以对此进行控制。例如,假设标题“品种国家”不是唯一的,并且您希望所有此类葡萄酒都位于“b”省,然后使用multi
选项,如下所示:
db.collection.update({title:'VINO',variety:'Rosato',country:'Germania')},
{$set: {province:"b"}},
{multi:true});
我想知道我正在尝试更新集合用户文档的一个或两个属性,这些属性包括 假设我只想更新用户名,如果我正在使用以下命令运行save,那么: 它将我的用户更改为: 但理想情况下,我只想更改我的用户名。 我的用户控制器是: 我的服务Impl是: 我的mongoRepository是: 请帮助我用Spring data mongodb以正确的方式实现这一点。
在MongoDB中是否有插入不包含某些属性的新文档的方法? 例如,假设我想插入一个文档,它看起来像: 但是我想插入这个文档,只有当一个文档包含 还不存在。是否有一种方法可以在单个操作中完成此操作(例如,像upsert一样,但不修改任何现有的匹配文档(如果存在),或者必须在两个单独的操作中完成此操作(查找以查看是否存在,然后插入)? 这并不重要,但了解它会非常有用,并且可以节省很多时间!
喂 我有一个文档,看起来像这样: 我尝试使用$push添加另一个街道文档,它错误地出现: pymongo.errors。WriteError:字段“地址”必须是数组,但在文档{_id:ObjectId('6049e88657e43d8801197c72')}中属于object类型 我正在使用的代码: 没有制作地址簿或任何东西,只是编辑它,这样它对没有上下文的人来说更有意义。 我想要的输出是文档如下
我目前正在尝试返回我刚刚添加到集合中的文档,以便在我的主页上实时显示它。 我遵循了我在这里找到的解决方案:链接到2018年解决方案。但是这个解决方案似乎不适用于最新的node.js和MongoDb版本。 我基本上是在尝试做与那篇文章中的人尝试做的相同的事情,但我得到了以下错误: 这是我的代码供参考:
我的mongodb中有一个收藏,如下所示 我要做的是根据优先级的值(如我应该得到的)获取字段
我需要更新Mongo DB中另一个文档内的数组中的一个文档