有没有办法只在一个文档中插入相关的嵌套评论,即使主文档的某些属性发生变化?
Is there a way to insert in only one document the nested review associated even if some attributes of the main document change?
大家好,我正在尝试用葡萄酒建立一个社交网络。对于我的应用程序,我使用 MongoDB 和 Neo4J。
在我的文档数据库中,我正在存储葡萄酒,对于我存储在其中的每一种葡萄酒,就像嵌套文档一样,所有相关的评论。
Wine has these attributes
改为
Wine_Reviews has these attributes
如果我不更改葡萄酒的值 MongoDB 创建一个文档,所有关联的评论都会像该酒的嵌套文档(正确)一样插入,但如果我更改葡萄酒的一个属性,如“Province” , MongoDB 将创建两个文档,因此即使标题相同也是两种葡萄酒。
Wrong situation
我的问题是:是否可以避免这种情况?在一个文件中插入所有具有相同名称的葡萄酒,即使同一种葡萄酒的所有其他属性都发生了变化?
(仅当属性相同时才能正常工作)
Correct situation but here wine attrbiutes don't change for reviews inserted
这是Crud_mongo.java的代码:
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");
}
当前(错误的)行为与您 _id
的设置一致。 _id
必须是唯一的,除了 title
你还有 4 个其他字段组成这个复杂的键,包括 province
所以如果你更改其他 4 个中的任何一个,就会创建一个新文档。
将数据库内部键(如 _id
)与 business/data 域键(如标题和其他一些属性)分开总是好的。我建议您让 MongoDB driver 在插入时负责构造 _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"}});
_id
是唯一的,因此它只会更新一个文档。如果你选择
要使用其他标准进行更新,它可能会或可能不会更新多个文档,但您可以控制它。例如,假设 title+variety+country 是 not unique,并且您希望所有此类葡萄酒都在省份“b”,然后按如下方式使用 multi
选项:
db.collection.update({title:'VINO',variety:'Rosato',country:'Germania')},
{$set: {province:"b"}},
{multi:true});
大家好,我正在尝试用葡萄酒建立一个社交网络。对于我的应用程序,我使用 MongoDB 和 Neo4J。 在我的文档数据库中,我正在存储葡萄酒,对于我存储在其中的每一种葡萄酒,就像嵌套文档一样,所有相关的评论。
Wine has these attributes
改为
Wine_Reviews has these attributes
如果我不更改葡萄酒的值 MongoDB 创建一个文档,所有关联的评论都会像该酒的嵌套文档(正确)一样插入,但如果我更改葡萄酒的一个属性,如“Province” , MongoDB 将创建两个文档,因此即使标题相同也是两种葡萄酒。 Wrong situation
我的问题是:是否可以避免这种情况?在一个文件中插入所有具有相同名称的葡萄酒,即使同一种葡萄酒的所有其他属性都发生了变化? (仅当属性相同时才能正常工作)
Correct situation but here wine attrbiutes don't change for reviews inserted
这是Crud_mongo.java的代码:
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");
}
当前(错误的)行为与您 _id
的设置一致。 _id
必须是唯一的,除了 title
你还有 4 个其他字段组成这个复杂的键,包括 province
所以如果你更改其他 4 个中的任何一个,就会创建一个新文档。
将数据库内部键(如 _id
)与 business/data 域键(如标题和其他一些属性)分开总是好的。我建议您让 MongoDB driver 在插入时负责构造 _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"}});
_id
是唯一的,因此它只会更新一个文档。如果你选择
要使用其他标准进行更新,它可能会或可能不会更新多个文档,但您可以控制它。例如,假设 title+variety+country 是 not unique,并且您希望所有此类葡萄酒都在省份“b”,然后按如下方式使用 multi
选项:
db.collection.update({title:'VINO',variety:'Rosato',country:'Germania')},
{$set: {province:"b"}},
{multi:true});