MongoDB - 对嵌入文档列表使用 $addToSet

10
我有一个( MongoDB )文档内的嵌入式文档列表,我想将新的嵌入式文档添加到现有嵌入式文档列表中。根据我的研究,可以使用 $addToSet 命令,但我无法确定 MongoDB 如何判断新文档是否已存在于嵌入式文档列表中,或者是一个新的文档,即 MongoDB 如何判断两个嵌入式文档是否相等?顺便说一下,我拥有的嵌入式文档不仅仅是值,它们是非常复杂的结构,所以我想知道是否有任何地方可以定义两个嵌入式文档之间的相等性...
1个回答

15

$addToSet 使用通常的mongodb 相等规则:它会进行深度逐值比较,因此下面这两个文档是相同的:

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

(文档内的顺序不能保证,因此它们是相同的)

而这些不是(成对的):

// 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 字段,但它没有特殊语义,并将像任何其他字段一样被处理。

非常感谢您提供的全面答案!我明白了!这听起来更像是一个字典比较... - Clara
根据文档,字段的顺序很重要。不过,是否有些变化或者我有什么误解呢? - mcont

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接