如何比较mongoDB对象&;是否使用node.js删除文档数组中的重复项?

如何比较mongoDB对象&;是否使用node.js删除文档数组中的重复项?,node.js,mongodb,mongoose-schema,Node.js,Mongodb,Mongoose Schema,我有一个名为“doc”的数组,其中包含一个列表,其中一些包含相同的ref-object-id,我必须删除该重复项,但所有代码都不起作用,因为我正在根据ref-object-id进行过滤,ref-object-id是object的形式。我必须访问对象内部的id,并根据该对象id对其进行过滤。这里的userId是引用对象id Answer.find({'blockId': questId}, (err, doc) => { if(doc!=null){

我有一个名为“doc”的数组,其中包含一个列表,其中一些包含相同的ref-object-id,我必须删除该重复项,但所有代码都不起作用,因为我正在根据ref-object-id进行过滤,ref-object-id是object的形式。我必须访问对象内部的id,并根据该对象id对其进行过滤。这里的userId是引用对象id

Answer.find({'blockId': questId}, (err, doc) => {
        if(doc!=null){
            userId = 0;
            userList = [];
            userIdd = 0;
            uslist = [];
            for(var i = 0; i<doc.length; i++){
                if(userId != doc[i].userId){
                    userIdList.push({'userId':doc[i].userId});
                    userId = doc[i].userId;
                }
            }
        }else{

        }
    });
Answer.find({'blockId':questId},(err,doc)=>{
如果(doc!=null){
userId=0;
userList=[];
userIdd=0;
uslist=[];

对于(var i=0;i如果您从数据库中获取
doc[i].userId
字段值作为
ObjectId()
,请尝试以下操作:

Answer.find({ 'blockId': questId }, (err, doc) => {
    if (err) {
        // return here itself
    }
    let userId = '';
    let userIdList = [];
    if (doc.length) {
        for (var i = 0; i < doc.length; i++) {
            /** Since we're using mongoose use `.toHexString()` to convert to string & compare,
               if you're using mongoDB driver use `toString()` to convert to string */.
            if (userId != (doc[i].userId).toHexString()) {
                userIdList.push({ 'userId': doc[i].userId });
                userId = (doc[i].userId).toHexString();
            }
        }
    } else {
       console.log('No matching answers found for blockId ::', questId)
    }
})
收集数据:

/* 1 */
{
    "_id" : ObjectId("5e103f0b400289966e01dc47"),
    "blockId" : 1,
    "userId" : ObjectId("5dfeac7b400289966e2042c7")
}

/* 2 */
{
    "_id" : ObjectId("5e103f34400289966e01e1f9"),
    "blockId" : 1,
    "userId" : ObjectId("5dfeac7b400289966e2042c5")
}

/* 3 */
{
    "_id" : ObjectId("5e103f4a400289966e01e56c"),
    "blockId" : 1,
    "userId" : ObjectId("5dfeac7b400289966e2042c7")
}

/* 4 */
{
    "_id" : ObjectId("5e103f51400289966e01e678"),
    "blockId" : 1,
    "userId" : ObjectId("5dfeac7b400289966e2042c6")
}

/* 5 */
{
    "_id" : ObjectId("5e103f57400289966e01e793"),
    "blockId" : 1,
    "userId" : ObjectId("5dfeac7b400289966e2042c1")
}

/* 6 */
{
    "_id" : ObjectId("5e103f61400289966e01e92b"),
    "blockId" : 2,
    "userId" : ObjectId("5dfeac7b400289966e2042c9")
}

/* 7 */
{
    "_id" : ObjectId("5e1040c3400289966e021168"),
    "blockId" : 1,
    "userId" : ObjectId("5dfeac7b400289966e2042c5")
}
/* 1 */
/** Duplicates removed */
{
    "_id" : {
        "blockId" : 1
    },
    "userIds" : [ 
        ObjectId("5dfeac7b400289966e2042c1"), 
        ObjectId("5dfeac7b400289966e2042c6"), 
        ObjectId("5dfeac7b400289966e2042c5"), 
        ObjectId("5dfeac7b400289966e2042c7")
    ]
}
结果:

/* 1 */
{
    "_id" : ObjectId("5e103f0b400289966e01dc47"),
    "blockId" : 1,
    "userId" : ObjectId("5dfeac7b400289966e2042c7")
}

/* 2 */
{
    "_id" : ObjectId("5e103f34400289966e01e1f9"),
    "blockId" : 1,
    "userId" : ObjectId("5dfeac7b400289966e2042c5")
}

/* 3 */
{
    "_id" : ObjectId("5e103f4a400289966e01e56c"),
    "blockId" : 1,
    "userId" : ObjectId("5dfeac7b400289966e2042c7")
}

/* 4 */
{
    "_id" : ObjectId("5e103f51400289966e01e678"),
    "blockId" : 1,
    "userId" : ObjectId("5dfeac7b400289966e2042c6")
}

/* 5 */
{
    "_id" : ObjectId("5e103f57400289966e01e793"),
    "blockId" : 1,
    "userId" : ObjectId("5dfeac7b400289966e2042c1")
}

/* 6 */
{
    "_id" : ObjectId("5e103f61400289966e01e92b"),
    "blockId" : 2,
    "userId" : ObjectId("5dfeac7b400289966e2042c9")
}

/* 7 */
{
    "_id" : ObjectId("5e1040c3400289966e021168"),
    "blockId" : 1,
    "userId" : ObjectId("5dfeac7b400289966e2042c5")
}
/* 1 */
/** Duplicates removed */
{
    "_id" : {
        "blockId" : 1
    },
    "userIds" : [ 
        ObjectId("5dfeac7b400289966e2042c1"), 
        ObjectId("5dfeac7b400289966e2042c6"), 
        ObjectId("5dfeac7b400289966e2042c5"), 
        ObjectId("5dfeac7b400289966e2042c7")
    ]
}
或者,如果您只是想使用
.find()
&仍然在
节点.js中执行此操作,同样,如果您的操作都是关于唯一用户ID的,那么至少要在代码中添加投影,以便仅从DB中检索所需的字段:

Answer.find({ 'blockId': questId }, {_id :0, 'blockId':1, userId:1 }, (err, doc) => { })

我有一个简单的解决办法。 如果“doc”是包含重复项的数组

 userIdList = [];
 userIdList = Object.values(doc.reduce((acc,cur)=>Object.assign(acc,{[cur.userId.toString()]:cur}),{}));