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命令查找单个文档并在更新中有条件语句的主要内容,如果未能解决你的问题,请参考以下文章

mongodb使用条件查找文档并更新相应文档中的另一个字段

MongoDB——文档操作(更新文档)

MongoDB——文档操作(更新文档)

《MongoDB入门教程》第07篇 CRUD之查找文档

《MongoDB入门教程》第07篇 CRUD之查找文档

《MongoDB入门教程》第07篇 CRUD之查找文档