【问题标题】:MongoDB - $addToSet on a list of Embedded DocumentMongoDB - 嵌入式文档列表上的 $addToSet
【发布时间】:2014-02-05 21:28:06
【问题描述】:

我在一个文档中有一个 (mongodb) 嵌入式文档列表,我有兴趣在现有文档列表中添加一个新的嵌入式文档。

据我研究,我可以使用$addToSet,我想不通的是MongoDB如何确定新文档是否已经存在于嵌入文档列表中,或者它是否是一个新文档,即如何MongoDB 判断 2 个嵌入文档是否相等?

附言我拥有的嵌入文档不仅仅是值,它们是相当复杂的结构,所以我想知道是否有任何地方可以定义它们之间的相等性意味着什么......

【问题讨论】:

    标签: mongodb operation embedded-documents


    【解决方案1】:

    $addToSet 使用通常的mongodb equality rules:它会进行逐个值的深度比较,因此以下两个文档是相同的:

    { name: "John", hobbies: ["coding", "drinking", "chess"] }
    { hobbies: ["coding", "drinking", "chess"], name: "John" }
    

    (文档is not guaranteed内的顺序,所以它们是相同的)

    而那些不是(成对的):

    // compare to:
    { name: "John", hobbies: ["chess", "coding", "drinking"] } 
    
    // in arrays, the order matters:
    { name: "John", hobbies: ["coding", "drinking", "chess"] } 
    
    // field names and values are case sensitive
    { Name: "John", hobbies: ["chess", "coding", "drinking"] } 
    { name: "john", hobbies: ["chess", "coding", "drinking"] } 
    
    // additional field:
    { name: "John", lastName: "Doe", hobbies: ["chess", "coding", "drinking"] }
    
    // missing field:
    { name: "John" }
    

    请注意这里没有特殊字段。您可以添加 _id 字段,但它没有特殊语义,将与任何其他字段一样处理。

    【讨论】:

    • 非常感谢您的全面回答!我懂了!听起来更像是字典比较……
    • 根据docs,字段顺序很重要。有什么变化还是我误解了什么?
    猜你喜欢
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多