MongoDB:$ addToSet/$ push文件只有在尚不存在时才会出现

Kev*_*vin 9 php mongodb

我有一个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属性放入自己的集合中是否可以更好地实现可伸缩性?

bm_*_*m_i 5

根据我的经验,你不能"$ push"或"$ addToSet"的原因是你的目标"成员"可能是一个嵌入对象(或在创建后转换为一个).你只能在嵌入式阵列上使用$ push,$ pushAll,$ addToSet ......

不幸的是,对于我们php开发人员来说,游标查询总是将数据作为数组返回,检查"成员"之类的东西是否是数组或对象的最佳方法是在mongo shell中运行find()并查找卷曲/结果中的方括号("{}"或"[]").

希望这可以帮助.


Dmi*_*tri 1

为什么不拥有一个存储 list_id、email、added_date 的集合,然后您可以在 list_id 和 email 两个键上创建唯一索引。这将阻止插入具有相同 list_id 和电子邮件的记录

不会有嵌入文档。您仍然可以通过 list_id 使用 find()