我有一个名为
lists
的集合,每个文档都有一个members
数组。 members
数组的每个元素都是一个文档,其中包含一个email
属性、一个创建date
属性和一些其他元数据。我在members.email
上设置了唯一索引,以防止将相同的电子邮件输入到同一列表中两次,但我想保留原始的date
值。不幸的是,$addToSet
和$push
似乎都无法实现这一点。
使用$push的示例:
$lists->update(array('_id' => $list['_id'], 'members.email' => array('$ne' => $email)), array('$push' => array('members' => array(
'email' => $email,
'date' => new MongoDate(),
// etc.
))));
同时使用$addToSet:
$lists->update(array('_id' => $list['_id']), array('$addToSet' => array('members' => array(
'email' => $email,
'date' => new MongoDate(),
// etc.
))));
这两个示例由于(我猜)唯一的date
值,替换了整个嵌入式文档。是否有可能仅在members.email
不存在时才$push
“member”文档,或者我需要分两个命令执行?
或者,从可伸缩性的角度考虑,将members
放入自己的集合中,并使用类似于parent_list
的属性是否更好?