我尝试弹出并从文档中存储的数组中检索元素。我不能使用$ 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值,那将是理想的。有关如何做到这一点的任何建议吗?
谢谢, - 萨米尔
答案 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