如何比较mongoDB对象&;是否使用node.js删除文档数组中的重复项?
我有一个名为“doc”的数组,其中包含一个列表,其中一些包含相同的ref-object-id,我必须删除该重复项,但所有代码都不起作用,因为我正在根据ref-object-id进行过滤,ref-object-id是object的形式。我必须访问对象内部的id,并根据该对象id对其进行过滤。这里的userId是引用对象id如何比较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){
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}),{}));