亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

mongodb如何對含有內嵌數組的集合進行檢索

mongodb如何對含有內嵌數組的集合進行檢索

手掌心 2019-05-14 09:08:08
mongodb如何對含有內嵌數組的集合進行檢索
查看完整描述

2 回答

?
千巷貓影

TA貢獻1829條經驗 獲得超7個贊


我用的是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]
});





查看完整回答
反對 回復 2019-05-15
  • 2 回答
  • 0 關注
  • 1570 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號