有没有办法只在一个文档中插入相关的嵌套评论,即使主文档的某些属性发生变化?

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});