【问题标题】:Mongodb load collection by IDMongodb 按ID 负载收集
【发布时间】:2018-04-27 22:42:34
【问题描述】:

这里可能很简单。 我有 2 个 mongoDb 集合,一个(用户)具有 objectId,另一个(列表)具有 userId。

我想通过搜索 objectId (currentUser._id) 来获取列表集合中的文档。

我该怎么做?

我想在其上显示列表的页面组件:

export class ManageComponent implements OnInit {
    listing : Listing;
    listings: Listing[] = [];
currentUser: User;

constructor(
    private listingService: ListingService,
    private userService: UserService) {
        this.currentUser = JSON.parse(localStorage.getItem('currentUser'));
     }  

ngOnInit() {
    this.loadAllListings();
} 

private loadAllListings() {
    this.listingService.getAll().subscribe(listings => { this.listings = listings; });
}


private loadById(userId: string) {
    this.listingService.getById(userId).subscribe(listings => { this.listings = listings});
    }
}

我有一个用于 CRUD 操作的列表服务(有些省略)

import { Injectable } from '@angular/core';
import { Http, Headers, RequestOptions, Response } from '@angular/http';

import { Listing } from '../_models/index';

@Injectable()
export class ListingService {

constructor(private http: Http) { }

getAll() {
    return this.http.get('/listings').map((response: Response) => response.json());
}

getById(_id: string) {
    return this.http.get('/listings/' + _id).map((response: Response) => response.json());
}

getByUserId(userId: string) {
    return this.http.get('/listings/' + userId).map((response: Response) => response.json());
}

create(listing: Listing) {
    return this.http.post('/listings/add', listing);
}

使用服务器端服务的服务器端列表控制器(见下文):

function getRelevant(req, res) {
listingService.getByUserId(req.listing.sub)
    .then(function (listing) {
        if (listing) {
            res.send(listing);
        } else {
            res.sendStatus(404);
        }
    })
    .catch(function (err) {
        res.status(400).send(err);
    });
}

服务器端列表服务:

function getByUserId(userId) {
var deferred = Q.defer();

db.listings.findById(userId, function (err, listing) {
    if (err) deferred.reject(err.name + ': ' + err.message);

    if (listing) {
        // return listing 
        deferred.resolve(listing);
    } else {
        // listing not found
        deferred.resolve();
    }
});

return deferred.promise;
}

【问题讨论】:

  • 你的问题不是很清楚,所以我不会提供这个作为答案,但是你在寻找类似(伪代码)var your_user = db.users.findOne({_id: some_user_id}); var user_listings = db.listings.find({user_id: your_user._id}); 的东西吗?
  • 这是“前端”代码,与数据库无关。有很多关于基本 CRUD 操作的教程。我建议您从MongoDB CRUD Operations 上的核心文档开始,然后查找使用特定驱动程序实现的文档。 Stack Overflow 不是让某人“为您编写代码”的服务。如果您有后端代码并且某个部分有问题,那么请展示您的努力,有人可以为您指明正确的方向。通常要求“端到端”本质上是一个“教程”太宽泛了。
  • @NeilLunn - 我也有后端代码,但基本上是我想做的,因为我已经有了当前登录用户的 _id,我想在列表集合中返回使用这个 _id 的文档作为参考。
  • 本质上是“你的问题太宽泛了”。如果您有后端代码,那么这应该是问题中的 only 代码,您可以询问您不理解的“特定”部分。我对此再清楚不过了。不会给出“端到端教程”。

标签: javascript mongodb angular meanjs


【解决方案1】:

db.listings.aggregate([ $lookup:{ 来自:“用户”, localField: "currentUser._id", 外国字段:“_id”, 结果” } } ])。找一个({ user_id:你要搜索的id })

【讨论】:

    【解决方案2】:

    MongoDB 的函数findById() 将通过操作该函数的 ID 查找当前模型的文档(db.listings.findById() 将通过列表 ID 查找所有列表)。

    也就是说,如果您想通过模型中的其他标准来find (listing)。你需要做find({query})

    具体而言,您需要:

    const query = {userId: userIdThatIsPassedIn};
    db.listings.find(query).exec(callback);
    

    【讨论】:

      猜你喜欢
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 2019-11-15
      • 2020-12-08
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      相关资源
      最近更新 更多