php – MongoDB:只有$addToSet / $push文件尚不存在

我有一个列表集合,其中每个文档都有一个成员数组.成员数组的每个元素都是一个包含电子邮件属性,创建日期属性和其他元数据的文档.我在members.email上有一个唯一的索引,以防止同一个电子邮件被输入同一个列表两次,但我想保留原始日期值.不幸的是,$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,// etc.
))));

由于(我假设)唯一的日期值,这两个示例都用新的替换整个嵌入文档.如果members.email尚不存在,或者我需要在两个命令中执行此操作,是否可以仅$$推送“成员”文档?

或者,将成员放在具有类似parent_list的属性的自己的集合中会更好地实现可伸缩性吗?

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

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

希望这可以帮助.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...