Node.js Mongodb:仅当对象的元素处于唯一状态时,才将该对象插入数组

Node.js Mongodb:仅当对象的元素处于唯一状态时,才将该对象插入数组,node.js,mongodb,mongodb-3.6,Node.js,Mongodb,Mongodb 3.6,我有这个收藏。仅当值是唯一的时,我才尝试将对象(item={label:“Chrome”,value:“Chrome”})添加到数组中,也就是说,仅当数组foo没有与item具有相同值的任何其他对象时,使用一个MongoDB操作,才在数组foo中插入整个对象,item foo=[{label:"IE",value:"ie"},{label:"Firefox",value:"firefox"}] 我认为$addToSet不支持像您希望的那样重复检测对象字段。但是,您可以这样做: db.bar.u

我有这个收藏。仅当
是唯一的时,我才尝试将对象(item={label:“Chrome”,value:“Chrome”})添加到数组中,也就是说,仅当数组
foo
没有与
item
具有相同值的任何其他对象时,使用一个MongoDB操作,才在数组
foo
中插入整个对象,
item

foo=[{label:"IE",value:"ie"},{label:"Firefox",value:"firefox"}]

我认为$addToSet不支持像您希望的那样重复检测对象字段。但是,您可以这样做:

db.bar.update(
{
“_id”:ObjectId(“5d3421a6a0100c1e083356e1”),
“foo”:{
“$not”:{
“$elemMatch”:{
“值”:“firefox”
}
}
}
},
{
“$push”:{
“foo”:{
“标签”:“假狐狸”,
“值”:“firefox”
}
}
}
)
首先,通过id+匹配父对象,使其不包含“firefox”作为foo对象数组中的值。然后指定一个
$push
,将新对象添加到foo数组中。这样,就不会在foo数组中创建重复项

不确定您的编码语言是什么,但以下是生成上述mongo查询的c代码,以防有人感兴趣:

使用MongoDB.Entities;
使用System.Linq;
命名空间堆栈溢出
{
公共课程
{
公共类栏:实体
{
公共项[]foo{get;set;}
}
公共类项目
{
公共字符串标签{get;set;}
公共字符串值{get;set;}
}
私有静态void Main(字符串[]args)
{
新DB(“测试”);
变量条=新条
{
foo=new[]
{
新项目{label=“IE”,value=“IE”},
新项目{label=“FireFox”,value=“FireFox”}
}
};
bar.Save();
var chrome=新项目{label=“chrome”,value=“chrome”};
var firefox=新项目{label=“Fake Fox”,value=“firefox”};
DB.Update()
.Match(b=>
b、 ID==bar.ID&&!b.foo.Any(i=>i.value==chrome.value))
.Modify(x=>x.Push(b=>b.foo,chrome))
.Execute();
DB.Update()
.Match(b=>b.ID==bar.ID&&!b.foo.Any(i=>i.value==firefox.value))
.Modify(x=>x.Push(b=>b.foo,firefox))
.Execute();
}
}

}
但是数组
foo
存储在数据库中,所以我们不能简单地使用
“$elemMatch”:{“value”:“firefox”}
,因为我们不知道值是firefox还是其他什么。如果你看c代码,使用的编码语言是javascript(NodeJs),对象是
{label=“firefox”,value=“firefox”}
已在数据库中。然后我们尝试添加一个新对象
{label=“Fake Fox”,value=“firefox”}
。但是新对象没有添加到foo数组中,因为标签已经存在于数据库中。我以为那就是你想做的?