php - MongoDB:$addToSet/$push 文件只有当它还不存在时

标签 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.
))));

还有 $addToSet:

$lists->update(array('_id' => $list['_id']), array('$addToSet' => array('members' => array(
    'email' => $email,
    'date' => new MongoDate(),
    // etc.
))));

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

或者,将 members 放在它们自己的集合中,并使用类似于 parent_list 的属性,在可扩展性方面会更好吗?

最佳答案

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

不幸的是,对于我们 php 开发人员来说,游标查询总是以数组形式返回数据,检查“成员”之类的东西是数组还是对象的最佳方法是在 mongo shell 中运行 find() 并查看对于结果中的大括号/方括号(“{}”或“[]”)。

希望这对您有所帮助。

关于php - MongoDB:$addToSet/$push 文件只有当它还不存在时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4356829/

相关文章:

Javascript 到 Mongodb 查询直通。安全的?不好的做法?

php - 使用 jqGrid 制作考勤表

php - b64_md5 算法,作者:Paul Johnston,地址:http ://pajhome. org.uk/crypt/md5

mysql - 我的rails应用程序使用mysql数据库和AR-ORM,但我想要印象派单一使用MongoDB

mongodb - 使用多个主机配置 mongodb Spark 连接器

javascript - MongoDB 仅返回其他文档中的用户与字段不匹配的文档

php - 我的 Sql 查询获取选定月份和年份的所有先前记录

php - Elasticsearch和Drupal,排序:未找到[field_XX]的映射以便排序

php - 如何将 simple_html_dom 对象转换回字符串?

node.js - 使用 mongoose,express 搜索短语