mongoose FindbyId和数组匹配的字符串
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongoose FindbyId和数组匹配的字符串相关的知识,希望对你有一定的参考价值。
我想通过id查询用户,然后只带来匹配类型的食物,我该怎么做?
var type = 'fish';
var id = '597a348286ffe50d882a3033';
User.findById(id, { 'food.type': type }, 'food', function(err, model) {
if (err) {
console.log(err);
}
if (!model) {
console.log('no model');
}
if (model) {
console.log(model);
}
});
答案
只需在获得用户后过滤食物。
User.findById(id, function (err, user) {
if (err) {
console.log(err);
}
if (!user) {
console.log('no user');
}
if (user) {
var food = user.food.filter(function (food) { return food.type === type; });
}
});
另一答案
我会使用aggregate
结合$filter
:
User.aggregate([{
$match: { '_id': ObjectId('597a348286ffe50d882a3033') }
}, {
$project:
{
food: {
$filter: {
input: '$food',
as: 'food',
cond: {
$eq: ['$$food.type', type]
}
}
}
}
}])
这将首先选择与给定Id匹配的文档,然后返回给定类型的食物列表。
另一答案
你可以创建一个像这样的obj
var obj =
{
_id:'597a348286ffe50d882a3033',
'food.type' : 'fish'
}
然后将此函数作为过滤器传递
User.find(obj, function(err, model) {
if (err) {
console.log(err);
}
// find will return empty array and not null
if (!model.length) {
console.log('no model');
}
if (model) {
console.log(model);
}
});
另一答案
如果使用mongo _id字段查找对象,则在查询执行后不必使用其他过滤函数,而是直接在搜索查询中指定
Model.findOne({_id: '123jasdoisd123', 'food.type': type },
function(err, food){
if(err) return err;
if(!food){
// send the empty data
return []
}
return food;
}
)
以上是关于mongoose FindbyId和数组匹配的字符串的主要内容,如果未能解决你的问题,请参考以下文章
更新 findOne()/find()/findById() 返回的文档 - mongoose
更新 findOne()/find()/findById() 返回的文档 - mongoose
?????? Mongoose ???????(??:findById)
为啥 mongoose 的 deleteOne 和 findById 对已删除的 id 起作用