在对象数组上使用 Mongoose / MongoDB $addToSet 功能
Posted
技术标签:
【中文标题】在对象数组上使用 Mongoose / MongoDB $addToSet 功能【英文标题】:Using Mongoose / MongoDB $addToSet functionality on array of objects 【发布时间】:2016-02-08 03:45:45 【问题描述】:假设我在 Mongoose 架构上有这个数组属性('articles'):
articles: [
kind: 'bear',
hashtag: 'foo'
,
kind: 'llama',
hashtag: 'baz',
,
kind: 'sheep',
hashtag: 'bar',
]
如何使用
$addToSet https://docs.mongodb.org/manual/reference/operator/update/addToSet/
通过检查 hashtag 的值来添加到这个数组中,看看它是否是唯一的?
例如,如果我想将以下对象添加到上述数组中,我希望 Mongo 将其作为重复项“拒绝”:
kind: 'tortoise',
hashtag: 'foo'
因为 hashtag=foo 已经被占用了。
问题是我只知道如何将$addToSet
与简单的整数数组一起使用...
例如,如果文章看起来像这样:
articles: [ 1 , 5 , 4, 2]
我会像这样使用 $addToSet:
var data =
"$addToSet":
"articles": 9
model.update(data);
但是如何使用唯一字段是字符串(在本例中为“hashtag”)的对象数组来完成相同的操作?文档没有说明这一点,似乎我到处都搜索过..
谢谢
【问题讨论】:
【参考方案1】:您需要使用$ne
运算符。
var data = 'kind': 'tortoise', 'hashtag': 'foo' ;
Model.update(
'articles.hashtag': '$ne': 'foo' ,
'$addToSet': 'articles': data
)
仅当“article”数组中没有标签值为“foo”的子文档时才会更新文档。
正如评论中提到的@BlakesSeven
一旦您测试其中一个值是否存在,
$addToSet
就变得无关紧要,因此为了代码清晰,这也可能是$push
。但是这个原理是正确的,因为$addToSet
作用于整个对象,而不仅仅是它的一部分。
Model.update(
'articles.hashtag': '$ne': 'foo' ,
'$push': 'articles': data
)
【讨论】:
如果对象包含“_id”字段怎么办?它仍然需要'$ne'运算符来检查重复性吗? @PavanVora,你可以在过滤器中'articles.hastag': '$ne': 'cats', 'articles.kind': '$ne': 'struct'
。
谢谢@styvane :) 感谢您的回复。【参考方案2】:
// add the comment's id to the commentsList :
// share.comments.commentsList.addToSet(callback._id);
share.update(
'$push': 'comments.commentsList': mongoose.Types.ObjectId(callback._id)
, function()
console.log('added comment id to the commentsList array of obectIds')
)
【讨论】:
以上是关于在对象数组上使用 Mongoose / MongoDB $addToSet 功能的主要内容,如果未能解决你的问题,请参考以下文章