mongodb如何对含有内嵌数组的集合进行检索
若以下回答无法解决问题,邀请你更新回答
展开全部
我用的是mongoose,不过也可以直接写mongodb的查询
var GoodSchema = new Schema({ name: String});
var ShopSchema = new Schema({
userId: Schema.ObjectId,
name: String,
point: {type: [Number], index: '2d'},
goods: [GoodSchema],
tags: {},
categorys: [String]
});
现在我想要根据给定的point 和商品名称,查找某个点附近的店家里面谁有卖这里商品的
原先查询语句是写成
var userPoint = [118.4444, 24.4444]
var content = "耳机"
var regexp = new Regexp(content);
ShopModel.find({point: {$near: userPoint}, goods: {$elemMatch: {name: regexp}}}).limit(100).exec(cb)
然后发现返回过来的商店里面带有的商品信息(goods)是所有的商品信息,不是我想要的只有匹配的商品的信息(mongodb 默认返回整个文档,除非你提供了projection)
接着去看了下mongodb的官方文档的projection里面的$,$elemMatch
但是根据官方文档里面讲的,无论$,还是$elemMatch都是返回数组里面第一个匹配元素,并不能像我所需要的返回所有匹配的元素
然后还大概了解了下 map/reduce, 但是不知道是不是该用它,还是有其他什么解决方案
(主要是性能考虑,如果采用map/reduce 显然对数组里面的每个元素都进行了一次过滤,然后如果说商家数量多点,商品数量多点,会不会死的比较惨。。。)
================
还是说我这个数据结构设计不合理,把商品单独出来
var GoodSchema = new Schema({ name: String, shopPoint: {type: [Number], index: '2d'}, shopId: Schema.ObjectId});
var ShopSchema = new Schema({
userId: Schema.ObjectId,
name: String,
point: {type: [Number], index: '2d'},
tags: {},
categorys: [String]
});
var GoodSchema = new Schema({ name: String});
var ShopSchema = new Schema({
userId: Schema.ObjectId,
name: String,
point: {type: [Number], index: '2d'},
goods: [GoodSchema],
tags: {},
categorys: [String]
});
现在我想要根据给定的point 和商品名称,查找某个点附近的店家里面谁有卖这里商品的
原先查询语句是写成
var userPoint = [118.4444, 24.4444]
var content = "耳机"
var regexp = new Regexp(content);
ShopModel.find({point: {$near: userPoint}, goods: {$elemMatch: {name: regexp}}}).limit(100).exec(cb)
然后发现返回过来的商店里面带有的商品信息(goods)是所有的商品信息,不是我想要的只有匹配的商品的信息(mongodb 默认返回整个文档,除非你提供了projection)
接着去看了下mongodb的官方文档的projection里面的$,$elemMatch
但是根据官方文档里面讲的,无论$,还是$elemMatch都是返回数组里面第一个匹配元素,并不能像我所需要的返回所有匹配的元素
然后还大概了解了下 map/reduce, 但是不知道是不是该用它,还是有其他什么解决方案
(主要是性能考虑,如果采用map/reduce 显然对数组里面的每个元素都进行了一次过滤,然后如果说商家数量多点,商品数量多点,会不会死的比较惨。。。)
================
还是说我这个数据结构设计不合理,把商品单独出来
var GoodSchema = new Schema({ name: String, shopPoint: {type: [Number], index: '2d'}, shopId: Schema.ObjectId});
var ShopSchema = new Schema({
userId: Schema.ObjectId,
name: String,
point: {type: [Number], index: '2d'},
tags: {},
categorys: [String]
});
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询