我有一个 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/