聚合匹配管道不等于MongoDB

ale*_*ngn 6 javascript mongodb node.js sails.js waterline

我正在为MongoDB的聚合管道工作,我正在尝试检索用户不等于变量的项目.

出于某种原因,我无法使其发挥作用.我尝试使用$not,$ne$nin以不同的方式但不能使它工作.

这是它的样子:

数据样本:

[{
    "_id": { "$oid": "565674e2e4b030fba33d8fdc" },
    "user": { "$oid": "565674832b85ce78732b7529" }
}, {
    "_id": { "$oid": "565674e2e4b030fba33d8fdc" },
    "user": { "$oid": "565674832b85ce78732b7529" }
}, {
    "_id": { "$oid": "565674e2e4b030fba33d8fdc" },
    "user": { "$oid": "56f9dfc5cc03ec883f7675d0" }
}]
Run Code Online (Sandbox Code Playgroud)

管道样本(针对此问题进行了简化):

哪里 req.query.user.id = "565674832b85ce78732b7529"

collection.aggregate([
    {
        $match: {
            user: {
                $nin: [ req.query.user.id ],
            }
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

这应该只返回最后一项.

您是否知道如何检索与用户不匹配的数据?

谢谢

编辑: 以下不起作用:

collection.aggregate([
    {
        $match: {
            'user.$oid': {
                $nin: [ req.query.user.id ],
            }
        }
    }
]);
Run Code Online (Sandbox Code Playgroud)

我也试过ObjectID()和mongodb抱怨:[MongoError: Argument must be a string]

var ObjectID = require('mongodb').ObjectID;

// Waterline syntax here
MyCollection.native(function (err, collection) {
    collection.aggregate([
        {
            $match: {
                'user': {
                    $nin: [ ObjectID(req.query.user.id) ],
                }
            }
        }
    ], function (err, result) {
        console.log(err, result);
    });
});
Run Code Online (Sandbox Code Playgroud)

但这行在shell中有效:

db.collection.aggregate([{$match:{"user":{"$nin":[ObjectId("565674832b85ce78732b7529")]}}}])
Run Code Online (Sandbox Code Playgroud)

4J4*_*J41 1

根据这里的答案,您可以更改

var ObjectId = require('mongodb'). ObjectID;
Run Code Online (Sandbox Code Playgroud)

var ObjectId = require('sails-mongo/node_modules/mongodb').ObjectID;
Run Code Online (Sandbox Code Playgroud)