MongoDB命令查找单个文档并在更新中有条件语句
Posted
技术标签:
【中文标题】MongoDB命令查找单个文档并在更新中有条件语句【英文标题】:MongoDB command to find a single document and have a conditional statement in the update 【发布时间】:2017-07-16 08:42:57 【问题描述】:这让我陷入了一段时间,我真的可以使用一些 SO 专家的指导。正如标题所述,我想找到一个具有提供的 _id 的文档,并且在更新中有一个条件语句来检查字段是否存在。如果不是,我想 $set 它并初始化一个用户 ID 数组。如果确实存在,我想运行 $push 命令并将我的用户 ID 推送到该字段中。
我尝试关注这个 stackover 帖子但没有结果: Mongodb findAndModify node js
这是我的代码:
db.collection("tweets").findAndModify(
'_id': tweetId , //query
[], //blank sort parameter
//update
$cond: //*
if: $ne: "likes" , //*
then: $set: "likes": [tweetId] , //*
else: $push: "likes": tweetId //*
//*
, //*
new: true , //return modified
function (err, valid) //callback function
console.log("In db update function");
if (err)
db_updateLikes_cb(err);
return;
console.log(err, valid);
db_updateLikes_cb(null, valid);
);
更新: 为了使用“_id”运行查询,您需要运行 mongodb 的 ObjectId 函数。这个函数需要导入到你在 Express/Node 中的 .js 文件中。下面是我用来使查询工作的代码。
const mongo = require('mongodb');
var o_id = new mongo.ObjectID(tweetId);
db.collection("tweets").update( '_id': objId , $push: "likes": userId , function ()
//do something
);
【问题讨论】:
【参考方案1】:这无需任何条件检查即可工作。您可以将 $push 用于不存在的密钥。
db.getCollection('tweets').findAndModify(
query: "_id": ObjectId("58b1998ad0a0e5bb2331caa4") ,
update: $push: "likes": ObjectId("58b1998ad0a0e5bb2331caa4")
)
他们的问题是您的语法错误。 findAndModify 要求您告诉它每个步骤是什么(查询、排序、删除、更新等)。另一件事是确保您传递的 tweetid 是 BSON。
有关更多信息,请参阅最新的 mongodb 文档。 https://docs.mongodb.com/manual/reference/method/db.collection.findAndModify/
【讨论】:
谢谢你,杰夫,我很沮丧,而是运行了一个 updateMany 命令来强制所有带有空白喜欢字段的文档。您知道哪种方法在资源管理方面会更好吗? 提前添加 likes 字段会产生一些磁盘存储开销,因为这些 json 字节必须存储在磁盘上。这些额外的存储字节重要吗?可能是。您必须根据您的用例考虑它。【参考方案2】:根据 mongodb 文档,第三个参数应该被删除,请检查一次,我不太了解 iam 还在学习它希望它有帮助 [https://docs.mongodb.com/manual/reference/method/db.collection.findAndModify/][1]
db.collection.findAndModify(
query: <document>,
sort: <document>,
remove: <boolean>,
update: <document>,
new: <boolean>,
fields: <document>,
upsert: <boolean>,
bypassDocumentValidation: <boolean>,
writeConcern: <document>,
collation: <document>
);
【讨论】:
如果是参考,应该是评论 感谢@vijay-kumar,这让我走上了正轨。运行命令时我不再收到错误并且收到 200 响应。我现在的问题是更新没有发生,我的更新声明有问题:( 确保你的 tweetid 被转换为 BSON - ObjectID(tweetid)。先用 find 来测试您的查询。确保该部分正常工作。以上是关于MongoDB命令查找单个文档并在更新中有条件语句的主要内容,如果未能解决你的问题,请参考以下文章