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

即使主文档的某些属性发生更改,是否有方法仅在一个文档中插入嵌套的审阅关联?

常波
2023-03-14

大家好,我正在努力建立一个葡萄酒社交网络。对于我的应用程序,我使用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");

    }


    

共有1个答案

萧修永
2023-03-14

当前(错误)行为与\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中另一个文档内的数组中的一个文档