Node.js 在单个查询中从数组中添加和删除

Node.js 在单个查询中从数组中添加和删除,node.js,mongodb,mongodb-query,Node.js,Mongodb,Mongodb Query,我想做一个查询,我想知道用户喜欢或不喜欢我的状态,现在我想做一个查询,这样我就不会从我的NODEJS服务器调用DB 2次,我的问题有任何解决方案 对于我们正在使用的Add collection.update({u id:id}, {$pull:{ '用户id':'xxxx xxxx xxxx'} } ); 对于我们正在使用的删除 collection.update({ _id: id }, { $push: { 'user_id': 'xxxx-xxxx-xxxx-xx

我想做一个查询,我想知道用户喜欢或不喜欢我的状态,现在我想做一个查询,这样我就不会从我的NODEJS服务器调用DB 2次,我的问题有任何解决方案

对于我们正在使用的Add collection.update({u id:id}, {$pull:{ '用户id':'xxxx xxxx xxxx'} } );

对于我们正在使用的删除

collection.update({ _id: id },
    { $push: { 
        'user_id': 'xxxx-xxxx-xxxx-xxxx' } 
    }
);

现在我想在一个查询中同时使用它们,比如if apply present in fruit array如果不添加就删除它。

MongoDB不允许在单个语句中同时使用
$pull
$push
或任何其他操作来更新相同的“路径”(因此是单个数组)。这主要与逻辑处理服务器端有关,在服务器端,更新操作从不被认为是在语句中排序的

例如:

{
“答复”:[
{“user”:“Tom”,“status”:“like”},
{“用户”:“莎拉”,“状态”:“不同”}
]
}
这并不是说这很有意义,但你不能这样做:

db.collection.update(
{},
{
“$pull”:{“responses”:{“user”:“Tom”,“status”:“like”},
“$push”:{“responses”:{“user”:“Tom”,“status”:“不像”}
}
)
由于此处的单个操作包含与“响应”在“同一路径”上的
$push
$pull
。无论您如何构造语句,都不需要以任何顺序执行

虽然我们可以“匹配”Tom的位置,并将其“状态”改为“不同”,但更好的模式是:

{
“喜欢”:[“汤姆”],
“不相似”:[“莎拉”],
“likesTotal”:1,
“不可能的总数”:1,
“总分”:0
}
这意味着,如果我想将“投票”更改为“汤姆”,那么您可以在操作的帮助下创建这样的构造,以启用单个请求和响应:

var bulk=db.collection.initializeOrderedBulkOp();
//投“汤姆的”不像他们已经有“喜欢”了
批量查找({
“喜欢”:“汤姆”,
“不象”:{“$ne”:“汤姆”}
}).updateOne({
“$pull”:{“likes”:“Tom”},
“$push”:{“unlikes”:“Tom”},
“$inc”:{
“likesTotal”:-1,
“不相似总计”:1
}
]);
//在一无所有的地方投下“汤姆”的新一票
批量查找({
“不象”:{“$ne”:“汤姆”},
“喜欢”:{“$ne”:“汤姆”}
}).updateOne({
“$push”:{“unlikes”:“Tom”},
“$inc”:{
“不可能的总数”:1,
“总分”:-1
}
});
bulk.execute();
这产生了一个非常好的模式。这里的每个更新操作基本上都是“原子”的,通过对单独的文档属性进行操作,每个修改器都可以无冲突地执行。而且作为“批量”操作,对“两者”的请求满足此处所有可能条件的更新操作在单个请求中发送,在单个响应中接收

当然,您的“客户机”逻辑还应该知道对特定项“喜欢/不喜欢”的用户的当前状态,但在通用API中强制执行这一点是一种良好的做法


它可以检查数组,还可以检查有用的计数器,以用于一般数据和一般查询目的,而无需“计算”数组或匹配类型的长度。

@johnyhk现在您了解我的需要了吗?