我有一个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.
))));
Run Code Online (Sandbox Code Playgroud)
并使用$ addToSet:
$lists->update(array('_id' => $list['_id']), array('$addToSet' => array('members' => array(
'email' => $email,
'date' => new MongoDate(),
// etc.
))));
Run Code Online (Sandbox Code Playgroud)
由于(我假设)唯一date值,这两个示例都用新的替换整个嵌入文档.是否可能只有$push"成员"文档(如果members.email尚未存在)或者我是否需要在两个命令中执行此操作?
或者,将members类似parent_list属性放入自己的集合中是否可以更好地实现可伸缩性?
根据我的经验,你不能"$ push"或"$ addToSet"的原因是你的目标"成员"可能是一个嵌入对象(或在创建后转换为一个).你只能在嵌入式阵列上使用$ push,$ pushAll,$ addToSet ......
不幸的是,对于我们php开发人员来说,游标查询总是将数据作为数组返回,检查"成员"之类的东西是否是数组或对象的最佳方法是在mongo shell中运行find()并查找卷曲/结果中的方括号("{}"或"[]").
希望这可以帮助.
为什么不拥有一个存储 list_id、email、added_date 的集合,然后您可以在 list_id 和 email 两个键上创建唯一索引。这将阻止插入具有相同 list_id 和电子邮件的记录
不会有嵌入文档。您仍然可以通过 list_id 使用 find()