Node.js驱动程序“mongodb”执行findAndModify() - 如何指定字段?

时间:2014-06-07 02:33:55

标签: node.js mongodb mongodb-query node-mongodb-native

我尝试弹出并从文档中存储的数组中检索元素。我不能使用$ pop,因为它不会返回POPed元素。我尝试使用findAndModify()代替。它可以在shell控制台中运行,但是我使用mongodb node.js驱动程序(https://www.npmjs.org/package/mongodb)时遇到了麻烦。

我的文档结构如下:

{ _id: '1', queue: [1,2,3]}

在mongo shell中,我这样做:

> db.collection.findAndModify({ query: { _id: 1 },
                                update: { $pop: { queue: -1 } },
                                fields: { queue: { $slice: 1 } }, new: false })

$ slice确保返回的文档显示刚刚处理过的元素。为了澄清,我对队列中的内容不感兴趣,我只对刚刚从队列中弹出的内容感兴趣。

返回:

< {_id: 1, "queue": [1]} // yes, it works! 

使用mongodb库,我不知道如何指定$ slice:1,它似乎不支持选项(?):

> db.collection('collection').findAndModify(
        { _id: 1 },
        [],
        { $pop: { queue: -1 }, queue: { $slice: 1 } },
        { new: false },
        function(error, results) {
           if(error) {
              console.log(error);
           }
           console.log(results);
        }
);

返回:

< MongoError: exception: Field name duplication not allowed with modifiers

基本上 - 我应该在哪里放置&#34;队列:{$ slice:1}&#34;参与nodejs查询以使其工作?是否在node.js驱动程序实现中支持它?

此外,看起来似乎没有像这样使用findAndModify()。如果$ pop返回POPed值,那将是理想的。有关如何做到这一点的任何建议吗?

谢谢,   - 萨米尔

1 个答案:

答案 0 :(得分:0)

似乎node.js实现不支持&#39;字段&#39;操作数。

我们已经找到了这项工作:

1)我们将每个元素存储在自己的文档中,而不是在同一文档中存储数组。

2)现在findAndModify的工作原理如下:

db.collection('collection').findAndModify(
        {}, // findAndModify will match it to the first document, if multiple docs are found
        [],
        {},
        {remove: true, new: false }, // returns & removes document from collection
        function(error, results) {
           if(error) {
              console.log(error);
           }
           console.log(results);
        }
);

一些很好的链接可以帮助我们,如果您遇到类似问题可能会对您有所帮助: https://blog.serverdensity.com/queueing-mongodb-using-mongodb/ http://www.slideshare.net/mongodb/mongodb-as-message-queue