以下是一个示例模型:
UserModel == {
name: String,
friends: [ObjectId],
}
friends
对应于某些其他模型的id
个对象列表,例如AboutModel
。
AboutModel == {
name: String,
}
User.findOne({name: 'Alpha'}, function(error, user){
About.find({}, function(error, abouts){ // consider abouts are all unique in this case
var doStuff = function(index){
if (!(about.id in user.friends)){
user.friends.push(about.id);
about.save();
}
if (index + 1 < abouts.length){
doStuff(index + 1)
}
}
doStuff(0) // recursively...
})
})
在这种情况下,条件'about.id in user.friends`似乎总是假的。怎么样?这与ObjectId的类型或它的保存方式有关吗?
注意:ObjectId
是Schema.ObjectId
的缩写;我不知道这本身是不是一个问题。
答案 0 :(得分:38)
如果about.id
是ObjectID的字符串表示形式且user.friends
是ObjectID数组,则可以使用Array#some
检查数组中是否about.id
:
var isInArray = user.friends.some(function (friend) {
return friend.equals(about.id);
});
some
调用将遍历user.friends
数组,在每个数组上调用equals
以查看它是否与about.id
匹配,并在找到匹配后立即停止。如果找到匹配项,则返回true
,否则返回false
。
您不能使用像indexOf
这样简单的内容,因为您希望按值比较ObjectID,而不是通过引用。
答案 1 :(得分:3)
我使用lo-dash并做类似的事情:
var id_to_found = '...';
var index = _.find(array, function(ch) {
return ch == id_to_found ;
});
if ( index!=undefined ) {
// CHILD_ALREADY_EXISTS
} else {
// OK NOT PRESENTS
}
答案 2 :(得分:-3)
我认为这是一个javascript问题,而不是Node.js / Mongoose问题 - 所以它实际上不属于现在的方式。
此外,about.id in user.friends
的问题是about.id
指向的对象和user.friends
中的对象不同;我相信in
会检查对象是否相等。
无论如何,在堆栈溢出时可以得到答案,以检查数组中元素的存在位置 -
user.friends.indexOf(about.id) > -1